]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Fix a crash freeing our embedded config
authorRoy Marples <roy@marples.name>
Mon, 2 Dec 2013 20:45:19 +0000 (20:45 +0000)
committerRoy Marples <roy@marples.name>
Mon, 2 Dec 2013 20:45:19 +0000 (20:45 +0000)
dhcpcd.c
if-options.c

index 9137a65eb35a987a7acc49e87b9c5d9834dd55a2..5288ed7c047a820780b177403528891e0161049a 100644 (file)
--- 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
 }
index 378670e504dc4662b3f736a19020565504b01aec..cf1bd7f636df745cbcd0411a79bf90402d8d3ba8 100644 (file)
@@ -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