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