Fixed struct sockaddr memory issues
Test: fixed docker yang repo copy Test: disable restconf-callhome for fcgi
This commit is contained in:
parent
7d8ddf7697
commit
3a9b276deb
9 changed files with 36 additions and 48 deletions
|
|
@ -841,7 +841,8 @@ restconf_socket_init(const char *netns0,
|
||||||
int *ss)
|
int *ss)
|
||||||
{
|
{
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
struct sockaddr sa = {0,};
|
struct sockaddr_in6 sin6 = {0,}; // because its larger than sin and sa
|
||||||
|
struct sockaddr *sa = (struct sockaddr *)&sin6;
|
||||||
size_t sa_len;
|
size_t sa_len;
|
||||||
const char *netns;
|
const char *netns;
|
||||||
|
|
||||||
|
|
@ -851,9 +852,9 @@ restconf_socket_init(const char *netns0,
|
||||||
netns = NULL;
|
netns = NULL;
|
||||||
else
|
else
|
||||||
netns = netns0;
|
netns = netns0;
|
||||||
if (clixon_inet2sin(addrtype, addrstr, port, &sa, &sa_len) < 0)
|
if (clixon_inet2sin(addrtype, addrstr, port, sa, &sa_len) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
if (clixon_netns_socket(netns, &sa, sa_len, backlog, flags, addrstr, ss) < 0)
|
if (clixon_netns_socket(netns, sa, sa_len, backlog, flags, addrstr, ss) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
clicon_debug(1, "%s ss=%d", __FUNCTION__, *ss);
|
clicon_debug(1, "%s ss=%d", __FUNCTION__, *ss);
|
||||||
retval = 0;
|
retval = 0;
|
||||||
|
|
|
||||||
|
|
@ -1060,7 +1060,8 @@ restconf_callhome_timer(int fd,
|
||||||
struct timeval t;
|
struct timeval t;
|
||||||
struct timeval t1 = {1, 0}; // XXX once every second
|
struct timeval t1 = {1, 0}; // XXX once every second
|
||||||
restconf_socket *rs;
|
restconf_socket *rs;
|
||||||
struct sockaddr sa = {0,};
|
struct sockaddr_in6 sin6 = {0,}; // because its larger than sin and sa
|
||||||
|
struct sockaddr *sa = (struct sockaddr *)&sin6;
|
||||||
size_t sa_len;
|
size_t sa_len;
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
|
|
@ -1071,14 +1072,14 @@ restconf_callhome_timer(int fd,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
h = rs->rs_h;
|
h = rs->rs_h;
|
||||||
if (clixon_inet2sin(rs->rs_addrtype, rs->rs_addrstr, rs->rs_port, &sa, &sa_len) < 0)
|
if (clixon_inet2sin(rs->rs_addrtype, rs->rs_addrstr, rs->rs_port, sa, &sa_len) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
if ((s = socket(sa.sa_family, SOCK_STREAM, 0)) < 0) {
|
if ((s = socket(sa->sa_family, SOCK_STREAM, 0)) < 0) {
|
||||||
clicon_err(OE_UNIX, errno, "socket");
|
clicon_err(OE_UNIX, errno, "socket");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
clicon_debug(1, "%s connect", __FUNCTION__);
|
clicon_debug(1, "%s connect", __FUNCTION__);
|
||||||
if (connect(s, &sa, sa_len) < 0){
|
if (connect(s, sa, sa_len) < 0){
|
||||||
close(s);
|
close(s);
|
||||||
/* Fail: Initiate new timer */
|
/* Fail: Initiate new timer */
|
||||||
timeradd(&now, &t1, &t);
|
timeradd(&now, &t1, &t);
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ RUN apk add --update sudo curl procps grep make bash expect
|
||||||
RUN adduser -D -H clicon
|
RUN adduser -D -H clicon
|
||||||
|
|
||||||
COPY --from=0 /clixon/build/ /usr/local/
|
COPY --from=0 /clixon/build/ /usr/local/
|
||||||
COPY --from=0 /usr/local/share/yang/* /usr/local/share/yang/standard/
|
COPY --from=0 /usr/local/share/yang/ /usr/local/share/yang/
|
||||||
COPY --from=0 /usr/local/share/mib-yangs/* /usr/local/share/mib-yangs/
|
COPY --from=0 /usr/local/share/mib-yangs/* /usr/local/share/mib-yangs/
|
||||||
|
|
||||||
# Log to stderr.
|
# Log to stderr.
|
||||||
|
|
|
||||||
|
|
@ -158,7 +158,7 @@ RUN adduser nginx clicon
|
||||||
RUN adduser www-data clicon
|
RUN adduser www-data clicon
|
||||||
|
|
||||||
COPY --from=0 /clixon/build/ /usr/local/
|
COPY --from=0 /clixon/build/ /usr/local/
|
||||||
COPY --from=0 /usr/local/share/yang/* /usr/local/share/yang/standard/
|
COPY --from=0 /usr/local/share/yang/ /usr/local/share/yang/
|
||||||
COPY --from=0 /usr/local/share/mib-yangs/* /usr/local/share/mib-yangs/
|
COPY --from=0 /usr/local/share/mib-yangs/* /usr/local/share/mib-yangs/
|
||||||
COPY --from=0 /clixon/build/mibs/* /usr/share/snmp/mibs/
|
COPY --from=0 /clixon/build/mibs/* /usr/share/snmp/mibs/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -162,8 +162,7 @@ EXPOSE 443/tcp
|
||||||
RUN adduser -D -H clicon
|
RUN adduser -D -H clicon
|
||||||
|
|
||||||
COPY --from=0 /clixon/build/ /usr/local/
|
COPY --from=0 /clixon/build/ /usr/local/
|
||||||
COPY --from=0 /usr/local/share/yang/* /usr/local/share/yang/standard/
|
COPY --from=0 /usr/local/share/yang/ /usr/local/share/yang/
|
||||||
COPY --from=0 /usr/local/share/yang/* /usr/local/share/yang/experimental/
|
|
||||||
COPY --from=0 /usr/local/share/openconfig/* /usr/local/share/openconfig/
|
COPY --from=0 /usr/local/share/openconfig/* /usr/local/share/openconfig/
|
||||||
COPY --from=0 /usr/local/share/mib-yangs/* /usr/local/share/mib-yangs/
|
COPY --from=0 /usr/local/share/mib-yangs/* /usr/local/share/mib-yangs/
|
||||||
COPY --from=0 /clixon/build/mibs/* /usr/share/snmp/mibs/
|
COPY --from=0 /clixon/build/mibs/* /usr/share/snmp/mibs/
|
||||||
|
|
|
||||||
|
|
@ -819,9 +819,10 @@ detect_endtag(char *tag,
|
||||||
* @param[out] sa sockaddr, should be allocated
|
* @param[out] sa sockaddr, should be allocated
|
||||||
* @param[out] salen length of sockaddr data
|
* @param[out] salen length of sockaddr data
|
||||||
* @code
|
* @code
|
||||||
* struct sockaddr sa = {0,};
|
* struct sockaddr_in6 sin6 = {0,}; // because its larger than sin and sa
|
||||||
|
* struct sockaddr *sa = &sin6;
|
||||||
* size_t sa_len;
|
* size_t sa_len;
|
||||||
* if (clixon_inet2sin(inet:ipv4-address, "0.0.0.0", 80, &sa, &sa_len) < 0)
|
* if (clixon_inet2sin(inet:ipv4-address, "0.0.0.0", 80, sa, &sa_len) < 0)
|
||||||
* err;
|
* err;
|
||||||
* @endcode
|
* @endcode
|
||||||
* Probably misplaced, need a clixon_network file?
|
* Probably misplaced, need a clixon_network file?
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,11 @@ s="$_" ; . ./lib.sh || if [ "$s" = $0 ]; then exit 0; else return 0; fi
|
||||||
|
|
||||||
APPNAME=example
|
APPNAME=example
|
||||||
|
|
||||||
|
# Only works with native
|
||||||
|
if [ "${WITH_RESTCONF}" != "native" ]; then
|
||||||
|
if [ "$s" = $0 ]; then exit 0; else return 0; fi # skip
|
||||||
|
fi
|
||||||
|
|
||||||
: ${clixon_restconf_callhome_client:=clixon_restconf_callhome_client}
|
: ${clixon_restconf_callhome_client:=clixon_restconf_callhome_client}
|
||||||
|
|
||||||
cfg=$dir/conf_yang.xml
|
cfg=$dir/conf_yang.xml
|
||||||
|
|
|
||||||
|
|
@ -108,24 +108,24 @@ callhome_connect(struct sockaddr *sa,
|
||||||
/* @see clixon_inet2sin */
|
/* @see clixon_inet2sin */
|
||||||
static int
|
static int
|
||||||
inet2sin(const char *addrtype,
|
inet2sin(const char *addrtype,
|
||||||
const char *addrstr,
|
const char *addrstr,
|
||||||
uint16_t port,
|
uint16_t port,
|
||||||
struct sockaddr *sa,
|
struct sockaddr *sa,
|
||||||
size_t *sa_len)
|
size_t *sa_len)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 *sin6;
|
struct sockaddr_in6 *sin6;
|
||||||
struct sockaddr_in *sin;
|
struct sockaddr_in *sin;
|
||||||
|
|
||||||
if (strcmp(addrtype, "inet:ipv6-address") == 0) {
|
if (strcmp(addrtype, "inet:ipv6-address") == 0) {
|
||||||
sin6 = (struct sockaddr_in6 *)sa;
|
sin6 = (struct sockaddr_in6 *)sa;
|
||||||
*sa_len = sizeof(struct sockaddr_in6);
|
*sa_len = sizeof(struct sockaddr_in6);
|
||||||
sin6->sin6_port = htons(port);
|
sin6->sin6_port = htons(port);
|
||||||
sin6->sin6_family = AF_INET6;
|
sin6->sin6_family = AF_INET6;
|
||||||
inet_pton(AF_INET6, addrstr, &sin6->sin6_addr);
|
inet_pton(AF_INET6, addrstr, &sin6->sin6_addr);
|
||||||
}
|
}
|
||||||
else if (strcmp(addrtype, "inet:ipv4-address") == 0) {
|
else if (strcmp(addrtype, "inet:ipv4-address") == 0) {
|
||||||
sin = (struct sockaddr_in *)sa;
|
sin = (struct sockaddr_in *)sa;
|
||||||
*sa_len = sizeof(struct sockaddr_in);
|
*sa_len = sizeof(struct sockaddr_in);
|
||||||
sin->sin_family = AF_INET;
|
sin->sin_family = AF_INET;
|
||||||
sin->sin_port = htons(port);
|
sin->sin_port = htons(port);
|
||||||
sin->sin_addr.s_addr = inet_addr(addrstr);
|
sin->sin_addr.s_addr = inet_addr(addrstr);
|
||||||
|
|
@ -234,7 +234,7 @@ usage(char *argv0)
|
||||||
"where options are\n"
|
"where options are\n"
|
||||||
"\t-h \tHelp\n"
|
"\t-h \tHelp\n"
|
||||||
"\t-D <level> \tDebug\n"
|
"\t-D <level> \tDebug\n"
|
||||||
"\t-f ipv4|ipv6 \tSocket address family(ipv4 default)\n"
|
"\t-f ipv4|ipv6 \tSocket address family(inet:ipv4-address default)\n"
|
||||||
"\t-a <addrstr> \tIP address (eg 1.2.3.4) - mandatory\n"
|
"\t-a <addrstr> \tIP address (eg 1.2.3.4) - mandatory\n"
|
||||||
"\t-p <port> \tPort (default 4334)\n"
|
"\t-p <port> \tPort (default 4334)\n"
|
||||||
"\t-c <file> \tClixon config file - (default /usr/local/etc/clixon.xml)\n"
|
"\t-c <file> \tClixon config file - (default /usr/local/etc/clixon.xml)\n"
|
||||||
|
|
@ -251,9 +251,10 @@ main(int argc,
|
||||||
{
|
{
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
int c;
|
int c;
|
||||||
char *family = "ipv4";
|
char *family = "inet:ipv4-address";
|
||||||
char *addr = NULL;
|
char *addr = NULL;
|
||||||
struct sockaddr sa = {0, };
|
struct sockaddr_in6 sin6 = {0, };
|
||||||
|
struct sockaddr *sa = (struct sockaddr *)&sin6;
|
||||||
size_t sa_len;
|
size_t sa_len;
|
||||||
int dbg = 0;
|
int dbg = 0;
|
||||||
uint16_t port = NETCONF_CH_SSH;
|
uint16_t port = NETCONF_CH_SSH;
|
||||||
|
|
@ -304,30 +305,9 @@ main(int argc,
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
#if 1
|
if (inet2sin(family, addr, port, sa, &sa_len) < 0)
|
||||||
if (inet2sin(family, addr, port, &sa, &sa_len) < 0)
|
|
||||||
goto done;
|
goto done;
|
||||||
#else
|
if (callhome_connect(sa, sa_len, &s) < 0)
|
||||||
if (strcmp(family, "ipv6") == 0){
|
|
||||||
sin_len = sizeof(struct sockaddr_in6);
|
|
||||||
sin6.sin6_port = htons(port);
|
|
||||||
sin6.sin6_family = AF_INET6;
|
|
||||||
inet_pton(AF_INET6, addr, &sin6.sin6_addr);
|
|
||||||
sa = (struct sockaddr *)&sin6;
|
|
||||||
}
|
|
||||||
else if (strcmp(family, "ipv4") == 0){
|
|
||||||
sin_len = sizeof(struct sockaddr_in);
|
|
||||||
sin.sin_family = AF_INET;
|
|
||||||
sin.sin_port = htons(port);
|
|
||||||
sin.sin_addr.s_addr = inet_addr(addr);
|
|
||||||
sa = (struct sockaddr *)&sin;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
fprintf(stderr, "-f <%s> is invalid family\n", family);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (callhome_connect(&sa, sa_len, &s) < 0)
|
|
||||||
goto done;
|
goto done;
|
||||||
/* For some reason this sshd returns -1 which is unclear why */
|
/* For some reason this sshd returns -1 which is unclear why */
|
||||||
if (ssh_server_exec(s, sshdbin, sshdconfigfile, clixonconfigfile, dbg) < 0)
|
if (ssh_server_exec(s, sshdbin, sshdconfigfile, clixonconfigfile, dbg) < 0)
|
||||||
|
|
|
||||||
|
|
@ -422,10 +422,11 @@ main(int argc,
|
||||||
char *cert_path = NULL;
|
char *cert_path = NULL;
|
||||||
char *key_path = NULL;
|
char *key_path = NULL;
|
||||||
FILE *fp = stdin; /* base file, stdin, can be overridden with -f */
|
FILE *fp = stdin; /* base file, stdin, can be overridden with -f */
|
||||||
|
struct sockaddr_in6 sin6 = {0,}; // because its larger than sin and sa
|
||||||
|
struct sockaddr *sa = (struct sockaddr *)&sin6;
|
||||||
size_t sa_len;
|
size_t sa_len;
|
||||||
char *addr = "127.0.0.1";
|
char *addr = "127.0.0.1";
|
||||||
char *family = "inet:ipv4-address";
|
char *family = "inet:ipv4-address";
|
||||||
struct sockaddr sa = {0,};
|
|
||||||
|
|
||||||
/* In the startup, logs to stderr & debug flag set later */
|
/* In the startup, logs to stderr & debug flag set later */
|
||||||
clicon_log_init(__FILE__, LOG_INFO, CLICON_LOG_STDERR);
|
clicon_log_init(__FILE__, LOG_INFO, CLICON_LOG_STDERR);
|
||||||
|
|
@ -499,10 +500,10 @@ main(int argc,
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (clixon_inet2sin(family, addr, port, &sa, &sa_len) < 0)
|
if (clixon_inet2sin(family, addr, port, sa, &sa_len) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
/* Bind port */
|
/* Bind port */
|
||||||
if (callhome_bind(&sa, sa_len, 1, &ss) < 0)
|
if (callhome_bind(sa, sa_len, 1, &ss) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
clicon_debug(1, "bind");
|
clicon_debug(1, "bind");
|
||||||
if ((ta = malloc(sizeof(*ta))) == NULL){
|
if ((ta = malloc(sizeof(*ta))) == NULL){
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue