ifchange.c: Fix ifcmd_iplist so that it works properly.
Also, add some extra diagnostic prints to ifcmd_raw.
This commit is contained in:
parent
6cfb1eb340
commit
ab68966442
@ -50,12 +50,21 @@ static struct dhcpmsg cfg_packet; // Copy of the current configuration packet.
|
|||||||
static int ifcmd_raw(char *buf, size_t buflen, char *optname,
|
static int ifcmd_raw(char *buf, size_t buflen, char *optname,
|
||||||
char *optdata, ssize_t optlen)
|
char *optdata, ssize_t optlen)
|
||||||
{
|
{
|
||||||
if (!optdata)
|
if (!optdata) {
|
||||||
|
log_warning("%s: (%s) '%s' option has no data",
|
||||||
|
client_config.interface, __func__, optname);
|
||||||
return -1;
|
return -1;
|
||||||
if (buflen < strlen(optname) + optlen + 3)
|
}
|
||||||
|
if (optlen > INT_MAX || optlen < 0) {
|
||||||
|
log_warning("%s: (%s) '%s' option optlen out of bounds",
|
||||||
|
client_config.interface, __func__, optname);
|
||||||
return -1;
|
return -1;
|
||||||
if (optlen > INT_MAX || optlen < 0)
|
}
|
||||||
|
if (buflen < strlen(optname) + optlen + 3) {
|
||||||
|
log_warning("%s: (%s) '%s' option buf too short",
|
||||||
|
client_config.interface, __func__, optname);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
int ioptlen = (int)optlen;
|
int ioptlen = (int)optlen;
|
||||||
ssize_t olen = snprintf(buf, buflen, "%s:%.*s;",
|
ssize_t olen = snprintf(buf, buflen, "%s:%.*s;",
|
||||||
optname, ioptlen, optdata);
|
optname, ioptlen, optdata);
|
||||||
@ -139,12 +148,11 @@ static int ifcmd_iplist(char *out, size_t outlen, char *optname,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
inet_ntop(AF_INET, optdata + optoff, ipbuf, sizeof ipbuf);
|
inet_ntop(AF_INET, optdata + optoff, ipbuf, sizeof ipbuf);
|
||||||
ssize_t wc = snprintf(buf + bufoff, sizeof buf, "%s:%s", optname, ipbuf);
|
ssize_t wc = snprintf(buf + bufoff, sizeof buf, "%s", ipbuf);
|
||||||
if (wc < 0 || (size_t)wc >= sizeof buf)
|
if (wc < 0 || (size_t)wc >= sizeof buf)
|
||||||
return -1;
|
return -1;
|
||||||
optoff += 4;
|
optoff += 4;
|
||||||
bufoff += wc;
|
bufoff += wc;
|
||||||
|
|
||||||
while (optlen - optoff >= 4) {
|
while (optlen - optoff >= 4) {
|
||||||
inet_ntop(AF_INET, optdata + optoff, ipbuf, sizeof ipbuf);
|
inet_ntop(AF_INET, optdata + optoff, ipbuf, sizeof ipbuf);
|
||||||
wc = snprintf(buf + bufoff, sizeof buf, ",%s", ipbuf);
|
wc = snprintf(buf + bufoff, sizeof buf, ",%s", ipbuf);
|
||||||
@ -153,10 +161,6 @@ static int ifcmd_iplist(char *out, size_t outlen, char *optname,
|
|||||||
optoff += 4;
|
optoff += 4;
|
||||||
bufoff += wc;
|
bufoff += wc;
|
||||||
}
|
}
|
||||||
|
|
||||||
wc = snprintf(buf + bufoff, sizeof buf, ";");
|
|
||||||
if (wc < 0 || (size_t)wc >= sizeof buf)
|
|
||||||
return -1;
|
|
||||||
return ifcmd_raw(out, outlen, optname, buf, strlen(buf));
|
return ifcmd_raw(out, outlen, optname, buf, strlen(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user