From d9fbb118757914d2a31583644bd25b486a1e13bb Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Mon, 2 Dec 2013 20:45:19 +0000 Subject: [PATCH] Fix a crash freeing our embedded config --- dhcpcd.c | 9 ++++---- if-options.c | 60 +++++++++++++++++++++++++++++----------------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/dhcpcd.c b/dhcpcd.c index 9137a65e..5288ed7c 100644 --- a/dhcpcd.c +++ b/dhcpcd.c @@ -140,6 +140,7 @@ free_globals(void) { int i; size_t n; + struct dhcp_opt *opt; for (i = 0; i < ifac; i++) free(ifav[i]); @@ -149,13 +150,13 @@ free_globals(void) 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 } diff --git a/if-options.c b/if-options.c index 378670e5..cf1bd7f6 100644 --- a/if-options.c +++ b/if-options.c @@ -1337,24 +1337,19 @@ parse_option(struct if_options *ifo, int opt, const char *arg) 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 @@ read_config(const char *file, 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 @@ read_config(const char *file, 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 @@ read_config(const char *file, 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 @@ read_config(const char *file, 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 @@ void free_options(struct if_options *ifo) { size_t i; + struct dhcp_opt *opt; if (ifo) { if (ifo->environ) { @@ -1673,11 +1676,14 @@ free_options(struct if_options *ifo) 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 -- 2.47.3