Mercurial > hg > dhcpcd
changeset 2185:7f9e761f857c draft
Fix a crash freeing our embedded config
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Mon, 02 Dec 2013 20:45:19 +0000 |
| parents | a06b9b6e7248 |
| children | b4d8f5bb2fe4 |
| files | dhcpcd.c if-options.c |
| diffstat | 2 files changed, 38 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/dhcpcd.c Mon Dec 02 17:17:05 2013 +0000 +++ b/dhcpcd.c Mon Dec 02 20:45:19 2013 +0000 @@ -140,6 +140,7 @@ { int i; size_t n; + struct dhcp_opt *opt; for (i = 0; i < ifac; i++) free(ifav[i]); @@ -149,13 +150,13 @@ free(ifdv); #ifdef INET - for (n = 0; n < dhcp_opts_len; n++) - free_dhcp_opt_embenc(&dhcp_opts[n]); + for (n = 0, opt = dhcp_opts; n < dhcp_opts_len; n++, opt++) + free_dhcp_opt_embenc(opt); free(dhcp_opts); #endif #ifdef INET6 - for (n = 0; n < dhcp6_opts_len; n++) - free_dhcp_opt_embenc(&dhcp6_opts[n]); + for (n = 0, opt = dhcp6_opts; n < dhcp6_opts_len; n++, opt++) + free_dhcp_opt_embenc(opt); free(dhcp6_opts); #endif }
--- a/if-options.c Mon Dec 02 17:17:05 2013 +0000 +++ b/if-options.c Mon Dec 02 20:45:19 2013 +0000 @@ -1337,24 +1337,19 @@ t &= ~ARRAY; } /* variable */ - if (fp) { - arg = strskipwhite(fp); - fp = strwhite(arg); - if (fp) - *fp++ = '\0'; - np = strdup(arg); - if (np == NULL) { - syslog(LOG_ERR, "%s: %m", __func__); - return -1; - } - } else { - if (t != EMBED && t != ENCAP) { - syslog(LOG_ERR, - "type %s requires a variable name", - arg); - return -1; - } - np = NULL; + if (!fp) { + syslog(LOG_ERR, + "type %s requires a variable name", arg); + return -1; + } + arg = strskipwhite(fp); + fp = strwhite(arg); + if (fp) + *fp++ = '\0'; + np = strdup(arg); + if (np == NULL) { + syslog(LOG_ERR, "%s: %m", __func__); + return -1; } if (opt == O_EMBED) dl = *dop_len; @@ -1448,6 +1443,9 @@ const char **e; size_t buflen, ol; #endif +#if !defined(INET) || !defined(INET6) + struct dhcp_opt *opt; +#endif /* Seed our default options */ ifo = calloc(1, sizeof(*ifo)); @@ -1493,7 +1491,7 @@ if (ifo->dhcp6_override == NULL) syslog(LOG_ERR, "%s: %m", __func__); else - ifo->dhcp6_override_len = INITDEFINES; + ifo->dhcp6_override_len = INITDEFINE6S; #endif /* Now load our embedded config */ @@ -1549,8 +1547,10 @@ dhcp_opts = ifo->dhcp_override; dhcp_opts_len = ifo->dhcp_override_len; #else - for (i = 0; i < ifo->dhcp_override_len; i++) - free_dhcp_opt_embenc(&ifo->dhcp_override[i]); + for (i = 0, opt = ifo->dhcp_override; + i < ifo->dhcp_override_len; + i++, opt++) + free_dhcp_opt_embenc(opt); free(ifo->dhcp_override); #endif ifo->dhcp_override = NULL; @@ -1560,8 +1560,10 @@ dhcp6_opts = ifo->dhcp6_override; dhcp6_opts_len = ifo->dhcp6_override_len; #else - for (i = 0; i < ifo->dhcp6_override_len; i++) - free_dhcp_opt_embenc(&ifo->dhcp6_override[i]); + for (i = 0, opt = ifo->dhcp6_override; + i < ifo->dhcp_override6_len; + i++, opt++) + free_dhcp_opt_embenc(opt); free(ifo->dhcp6_override); #endif ifo->dhcp6_override = NULL; @@ -1654,6 +1656,7 @@ free_options(struct if_options *ifo) { size_t i; + struct dhcp_opt *opt; if (ifo) { if (ifo->environ) { @@ -1673,11 +1676,14 @@ free(ifo->blacklist); free(ifo->fallback); - for (i = 0; i < ifo->dhcp_override_len; i++) - free_dhcp_opt_embenc(&ifo->dhcp_override[i]); + for (i = 0, opt = ifo->dhcp_override; + i < ifo->dhcp_override_len; + i++, opt++) + free_dhcp_opt_embenc(opt); free(ifo->dhcp_override); - for (i = 0; i < ifo->dhcp6_override_len; i++) - free_dhcp_opt_embenc(&ifo->dhcp6_override[i]); + for (i = 0, opt = ifo->dhcp6_override; + i < ifo->dhcp6_override_len; + i++, opt++) free(ifo->dhcp6_override); #ifdef INET6
