Module Name:    src
Committed By:   roy
Date:           Sat Mar  1 11:04:21 UTC 2014

Modified Files:
        src/external/bsd/dhcpcd/dist: dhcp.c dhcpcd.c if-options.c ipv6nd.c
            script.c

Log Message:
Sync


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/external/bsd/dhcpcd/dist/dhcp.c
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/dhcpcd/dist/dhcpcd.c
cvs rdiff -u -r1.6 -r1.7 src/external/bsd/dhcpcd/dist/if-options.c
cvs rdiff -u -r1.5 -r1.6 src/external/bsd/dhcpcd/dist/ipv6nd.c
cvs rdiff -u -r1.4 -r1.5 src/external/bsd/dhcpcd/dist/script.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/dhcpcd/dist/dhcp.c
diff -u src/external/bsd/dhcpcd/dist/dhcp.c:1.10 src/external/bsd/dhcpcd/dist/dhcp.c:1.11
--- src/external/bsd/dhcpcd/dist/dhcp.c:1.10	Tue Feb 25 13:20:23 2014
+++ src/external/bsd/dhcpcd/dist/dhcp.c	Sat Mar  1 11:04:21 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: dhcp.c,v 1.10 2014/02/25 13:20:23 roy Exp $");
+ __RCSID("$NetBSD: dhcp.c,v 1.11 2014/03/01 11:04:21 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -154,7 +154,9 @@ get_option(struct dhcpcd_ctx *ctx,
 		if (o == opt) {
 			if (op) {
 				if (!ctx->opt_buffer) {
-					ctx->opt_buffer = malloc(sizeof(*dhcp));
+					ctx->opt_buffer =
+					    malloc(DHCP_OPTION_LEN +
+					    BOOTFILE_LEN + SERVERNAME_LEN);
 					if (ctx->opt_buffer == NULL)
 						return NULL;
 				}
@@ -975,9 +977,8 @@ ssize_t
 write_lease(const struct interface *ifp, const struct dhcp_message *dhcp)
 {
 	int fd;
-	ssize_t bytes = sizeof(*dhcp);
-	const uint8_t *p = dhcp->options;
-	const uint8_t *e = p + sizeof(dhcp->options);
+	ssize_t bytes;
+	const uint8_t *e, *p;
 	uint8_t l;
 	uint8_t o = 0;
 	const struct dhcp_state *state = D_CSTATE(ifp);
@@ -996,6 +997,9 @@ write_lease(const struct interface *ifp,
 		return -1;
 
 	/* Only write as much as we need */
+	p = dhcp->options;
+	e = p + sizeof(dhcp->options);
+	bytes = sizeof(*dhcp);
 	while (p < e) {
 		o = *p;
 		if (o == DHO_END) {
@@ -1452,8 +1456,8 @@ checksum(const void *data, uint16_t len)
 	return ~sum;
 }
 
-static ssize_t
-dhcp_makeudppacket(uint8_t **p, const uint8_t *data, size_t length,
+static struct udp_dhcp_packet *
+dhcp_makeudppacket(ssize_t *sz, const uint8_t *data, size_t length,
 	struct in_addr source, struct in_addr dest)
 {
 	struct udp_dhcp_packet *udpp;
@@ -1462,7 +1466,7 @@ dhcp_makeudppacket(uint8_t **p, const ui
 
 	udpp = calloc(1, sizeof(*udpp));
 	if (udpp == NULL)
-		return -1;
+		return NULL;
 	ip = &udpp->ip;
 	udp = &udpp->udp;
 
@@ -1497,8 +1501,8 @@ dhcp_makeudppacket(uint8_t **p, const ui
 	ip->ip_len = htons(sizeof(*ip) + sizeof(*udp) + length);
 	ip->ip_sum = checksum(ip, sizeof(*ip));
 
-	*p = (uint8_t *)udpp;
-	return sizeof(*ip) + sizeof(*udp) + length;
+	*sz = sizeof(*ip) + sizeof(*udp) + length;
+	return udpp;
 }
 
 static void
@@ -1508,7 +1512,7 @@ send_message(struct interface *iface, in
 	struct dhcp_state *state = D_STATE(iface);
 	struct if_options *ifo = iface->options;
 	struct dhcp_message *dhcp;
-	uint8_t *udp;
+	struct udp_dhcp_packet *udp;
 	ssize_t len, r;
 	struct in_addr from, to;
 	in_addr_t a = 0;
@@ -1567,11 +1571,15 @@ send_message(struct interface *iface, in
 			dhcp_close(iface);
 		}
 	} else {
-		len = dhcp_makeudppacket(&udp, (uint8_t *)dhcp, len, from, to);
-		if (len == -1)
-			return;
-		r = ipv4_sendrawpacket(iface, ETHERTYPE_IP, udp, len);
-		free(udp);
+		r = 0;
+		udp = dhcp_makeudppacket(&r, (uint8_t *)dhcp, len, from, to);
+		if (udp == NULL) {
+			syslog(LOG_ERR, "dhcp_makeudppacket: %m");
+		} else {
+			r = ipv4_sendrawpacket(iface, ETHERTYPE_IP,
+			    (uint8_t *)udp, r);
+			free(udp);
+		}
 		/* If we failed to send a raw packet this normally means
 		 * we don't have the ability to work beneath the IP layer
 		 * for this interface.

Index: src/external/bsd/dhcpcd/dist/dhcpcd.c
diff -u src/external/bsd/dhcpcd/dist/dhcpcd.c:1.2 src/external/bsd/dhcpcd/dist/dhcpcd.c:1.3
--- src/external/bsd/dhcpcd/dist/dhcpcd.c:1.2	Tue Feb 25 14:10:09 2014
+++ src/external/bsd/dhcpcd/dist/dhcpcd.c	Sat Mar  1 11:04:21 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: dhcpcd.c,v 1.2 2014/02/25 14:10:09 roy Exp $");
+ __RCSID("$NetBSD: dhcpcd.c,v 1.3 2014/03/01 11:04:21 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -149,7 +149,7 @@ free_globals(struct dhcpcd_ctx *ctx)
 	}
 	if (ctx->ifdc) {
 		for (ctx->ifdc--; ctx->ifdc >= 0; ctx->ifdc--)
-			free(ctx->ifdv[ctx->ifac]);
+			free(ctx->ifdv[ctx->ifdc]);
 		free(ctx->ifdv);
 		ctx->ifdv = NULL;
 	}
@@ -660,7 +660,7 @@ static void
 init_state(struct interface *ifp, int argc, char **argv)
 {
 	struct if_options *ifo;
-	const char *reason = NULL;
+	const char *reason;
 
 	configure_interface(ifp, argc, argv);
 	ifo = ifp->options;
@@ -674,9 +674,7 @@ init_state(struct interface *ifp, int ar
 		ifo->options &= ~DHCPCD_IPV6RS;
 	}
 
-	if (!(ifp->ctx->options & DHCPCD_TEST))
-		script_runreason(ifp, "PREINIT");
-
+	reason = NULL; /* appease gcc */
 	if (ifo->options & DHCPCD_LINK) {
 		switch (carrier_status(ifp)) {
 		case LINK_DOWN:
@@ -691,10 +689,14 @@ init_state(struct interface *ifp, int ar
 			ifp->carrier = LINK_UNKNOWN;
 			return;
 		}
-		if (reason && !(ifp->ctx->options & DHCPCD_TEST))
-			script_runreason(ifp, reason);
 	} else
 		ifp->carrier = LINK_UNKNOWN;
+
+	if (!(ifp->ctx->options & DHCPCD_TEST))
+		script_runreason(ifp, "PREINIT");
+
+	if (ifp->carrier != LINK_UNKNOWN && !(ifp->ctx->options & DHCPCD_TEST))
+		script_runreason(ifp, reason);
 }
 
 void

Index: src/external/bsd/dhcpcd/dist/if-options.c
diff -u src/external/bsd/dhcpcd/dist/if-options.c:1.6 src/external/bsd/dhcpcd/dist/if-options.c:1.7
--- src/external/bsd/dhcpcd/dist/if-options.c:1.6	Tue Feb 25 13:20:23 2014
+++ src/external/bsd/dhcpcd/dist/if-options.c	Sat Mar  1 11:04:21 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: if-options.c,v 1.6 2014/02/25 13:20:23 roy Exp $");
+ __RCSID("$NetBSD: if-options.c,v 1.7 2014/03/01 11:04:21 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -204,8 +204,12 @@ add_environ(struct if_options *ifo, cons
 		return NULL;
 	}
 	p = strchr(match, '=');
-	if (p)
-		*p++ = '\0';
+	if (p == NULL) {
+		syslog(LOG_ERR, "%s: no assignment: %s", __func__, value);
+		free(match);
+		return NULL;
+	}
+	*p++ = '\0';
 	l = strlen(match);
 
 	while (lst && lst[i]) {
@@ -214,6 +218,7 @@ add_environ(struct if_options *ifo, cons
 				n = strdup(value);
 				if (n == NULL) {
 					syslog(LOG_ERR, "%s: %m", __func__);
+					free(match);
 					return NULL;
 				}
 				free(lst[i]);
@@ -225,6 +230,7 @@ add_environ(struct if_options *ifo, cons
 				n = realloc(lst[i], l + lv + 2);
 				if (n == NULL) {
 					syslog(LOG_ERR, "%s: %m", __func__);
+					free(match);
 					return NULL;
 				}
 				lst[i] = n;
@@ -238,6 +244,7 @@ add_environ(struct if_options *ifo, cons
 		i++;
 	}
 
+	free(match);
 	n = strdup(value);
 	if (n == NULL) {
 		syslog(LOG_ERR, "%s: %m", __func__);
@@ -246,12 +253,12 @@ add_environ(struct if_options *ifo, cons
 	newlist = realloc(lst, sizeof(char *) * (i + 2));
 	if (newlist == NULL) {
 		syslog(LOG_ERR, "%s: %m", __func__);
+		free(n);
 		return NULL;
 	}
 	newlist[i] = n;
 	newlist[i + 1] = NULL;
 	ifo->environ = newlist;
-	free(match);
 	return newlist[i];
 }
 
@@ -434,16 +441,18 @@ splitv(int *argc, char **argv, const cha
 		nt = strdup(t);
 		if (nt == NULL) {
 			syslog(LOG_ERR, "%s: %m", __func__);
-			return NULL;
+			free(o);
+			return v;
 		}
-		(*argc)++;
-		n = realloc(v, sizeof(char *) * ((*argc)));
+		n = realloc(v, sizeof(char *) * ((*argc) + 1));
 		if (n == NULL) {
 			syslog(LOG_ERR, "%s: %m", __func__);
-			return NULL;
+			free(o);
+			free(nt);
+			return v;
 		}
 		v = n;
-		v[(*argc) - 1] = nt;
+		v[(*argc)++] = nt;
 	}
 	free(o);
 	return v;
@@ -480,7 +489,7 @@ parse_addr(struct in_addr *addr, struct 
 	}
 	if (p != NULL)
 		*--p = '/';
-	else if (net != NULL)
+	else if (net != NULL && addr != NULL)
 		net->s_addr = ipv4_getnetmask(addr->s_addr);
 	return 0;
 }
@@ -623,7 +632,9 @@ parse_option(struct dhcpcd_ctx *ctx, con
 
 	dop = NULL;
 	dop_len = NULL;
+#ifdef INET6
 	i = 0;
+#endif
 	switch(opt) {
 	case 'f': /* FALLTHROUGH */
 	case 'g': /* FALLTHROUGH */
@@ -1515,6 +1526,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
 			    sizeof(**dop) * ((*dop_len) + 1))) == NULL)
 			{
 				syslog(LOG_ERR, "%s: %m", __func__);
+				free(np);
 				return -1;
 			}
 			*dop = ndop;

Index: src/external/bsd/dhcpcd/dist/ipv6nd.c
diff -u src/external/bsd/dhcpcd/dist/ipv6nd.c:1.5 src/external/bsd/dhcpcd/dist/ipv6nd.c:1.6
--- src/external/bsd/dhcpcd/dist/ipv6nd.c:1.5	Tue Feb 25 13:20:23 2014
+++ src/external/bsd/dhcpcd/dist/ipv6nd.c	Sat Mar  1 11:04:21 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: ipv6nd.c,v 1.5 2014/02/25 13:20:23 roy Exp $");
+ __RCSID("$NetBSD: ipv6nd.c,v 1.6 2014/03/01 11:04:21 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -360,6 +360,8 @@ ipv6nd_sendrsprobe(void *arg)
 
 	/* Set the outbound interface */
 	cm = CMSG_FIRSTHDR(&ctx->sndhdr);
+	if (cm == NULL) /* unlikely */
+		return;
 	cm->cmsg_level = IPPROTO_IPV6;
 	cm->cmsg_type = IPV6_PKTINFO;
 	cm->cmsg_len = CMSG_LEN(sizeof(pi));
@@ -369,6 +371,8 @@ ipv6nd_sendrsprobe(void *arg)
 
 	/* Hop limit */
 	cm = CMSG_NXTHDR(&ctx->sndhdr, cm);
+	if (cm == NULL) /* unlikely */
+		return;
 	cm->cmsg_level = IPPROTO_IPV6;
 	cm->cmsg_type = IPV6_HOPLIMIT;
 	cm->cmsg_len = CMSG_LEN(sizeof(hoplimit));
@@ -753,9 +757,8 @@ ipv6nd_handlera(struct ipv6_ctx *ctx, st
 
 	len -= sizeof(struct nd_router_advert);
 	p = ((uint8_t *)icp) + sizeof(struct nd_router_advert);
-	olen = 0;
 	lifetime = ~0U;
-	for (olen = 0; len > 0; p += olen, len -= olen) {
+	for (; len > 0; p += olen, len -= olen) {
 		if ((size_t)len < sizeof(struct nd_opt_hdr)) {
 			syslog(LOG_ERR, "%s: short option", ifp->name);
 			break;
@@ -1415,12 +1418,15 @@ ipv6nd_probeaddr(void *arg)
 	//memcpy(&dst.sin6_addr, &ap->addr, sizeof(dst.sin6_addr));
 	dst.sin6_scope_id = ap->iface->index;
 
-	sndhdr.msg_name = (caddr_t)&dst;
-	sndhdr.msg_iov[0].iov_base = ap->ns;
-	sndhdr.msg_iov[0].iov_len = ap->nslen;
+	ctx = ap->iface->ctx->ipv6;
+	ctx->sndhdr.msg_name = (caddr_t)&dst;
+	ctx->sndhdr.msg_iov[0].iov_base = ap->ns;
+	ctx->sndhdr.msg_iov[0].iov_len = ap->nslen;
 
 	/* Set the outbound interface */
-	cm = CMSG_FIRSTHDR(&sndhdr);
+	cm = CMSG_FIRSTHDR(&ctx->sndhdr);
+	if (cm == NULL) /* unlikely */
+		return;
 	cm->cmsg_level = IPPROTO_IPV6;
 	cm->cmsg_type = IPV6_PKTINFO;
 	cm->cmsg_len = CMSG_LEN(sizeof(pi));
@@ -1430,6 +1436,8 @@ ipv6nd_probeaddr(void *arg)
 
 	/* Hop limit */
 	cm = CMSG_NXTHDR(&sndhdr, cm);
+	if (cm == NULL) /* unlikely */
+		return;
 	cm->cmsg_level = IPPROTO_IPV6;
 	cm->cmsg_type = IPV6_HOPLIMIT;
 	cm->cmsg_len = CMSG_LEN(sizeof(hoplimit));
@@ -1571,6 +1579,8 @@ ipv6nd_proberouter(void *arg)
 
 	/* Set the outbound interface */
 	cm = CMSG_FIRSTHDR(&ctx->sndhdr);
+	if (cm == NULL) /* unlikely */
+		return;
 	cm->cmsg_level = IPPROTO_IPV6;
 	cm->cmsg_type = IPV6_PKTINFO;
 	cm->cmsg_len = CMSG_LEN(sizeof(pi));
@@ -1580,6 +1590,8 @@ ipv6nd_proberouter(void *arg)
 
 	/* Hop limit */
 	cm = CMSG_NXTHDR(&ctx->sndhdr, cm);
+	if (cm == NULL) /* unlikely */
+		return;
 	cm->cmsg_level = IPPROTO_IPV6;
 	cm->cmsg_type = IPV6_HOPLIMIT;
 	cm->cmsg_len = CMSG_LEN(sizeof(hoplimit));

Index: src/external/bsd/dhcpcd/dist/script.c
diff -u src/external/bsd/dhcpcd/dist/script.c:1.4 src/external/bsd/dhcpcd/dist/script.c:1.5
--- src/external/bsd/dhcpcd/dist/script.c:1.4	Tue Feb 25 13:20:23 2014
+++ src/external/bsd/dhcpcd/dist/script.c	Sat Mar  1 11:04:21 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: script.c,v 1.4 2014/02/25 13:20:23 roy Exp $");
+ __RCSID("$NetBSD: script.c,v 1.5 2014/03/01 11:04:21 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -61,6 +61,7 @@ static const char * const if_params[] = 
 	"interface",
 	"reason",
 	"pid",
+	"ifcarrier",
 	"ifmetric",
 	"ifwireless",
 	"ifflags",
@@ -142,11 +143,13 @@ append_config(char ***env, ssize_t *len,
 {
 	ssize_t i, j, e1;
 	char **ne, *eq, **nep, *p;
+	int ret;
 
 	if (config == NULL)
 		return 0;
 
 	ne = *env;
+	ret = 0;
 	for (i = 0; config[i] != NULL; i++) {
 		eq = strchr(config[i], '=');
 		e1 = eq - config[i] + 1;
@@ -154,22 +157,29 @@ append_config(char ***env, ssize_t *len,
 			if (strncmp(ne[j] + strlen(prefix) + 1,
 				config[i], e1) == 0)
 			{
+				p = make_var(prefix, config[i]);
+				if (p == NULL) {
+					ret = -1;
+					break;
+				}
 				free(ne[j]);
-				ne[j] = make_var(prefix, config[i]);
-				if (ne[j] == NULL)
-					return -1;
+				ne[j] = p;
 				break;
 			}
 		}
 		if (j == *len) {
 			j++;
 			p = make_var(prefix, config[i]);
-			if (p == NULL)
-				return -1;
+			if (p == NULL) {
+				ret = -1;
+				break;
+			}
 			nep = realloc(ne, sizeof(char *) * (j + 1));
 			if (nep == NULL) {
 				syslog(LOG_ERR, "%s: %m", __func__);
-				return -1;
+				free(p);
+				ret = -1;
+				break;
 			}
 			ne = nep;
 			ne[j - 1] = p;
@@ -177,7 +187,7 @@ append_config(char ***env, ssize_t *len,
 		}
 	}
 	*env = ne;
-	return 0;
+	return ret;
 }
 #endif
 
@@ -188,6 +198,8 @@ arraytostr(const char *const *argv, char
 	char *p;
 	size_t len, l;
 
+	if (*argv == NULL)
+		return 0;
 	len = 0;
 	ap = argv;
 	while (*ap)
@@ -212,39 +224,53 @@ make_env(const struct interface *ifp, co
 	ssize_t e, elen, l;
 	const struct if_options *ifo = ifp->options;
 	const struct interface *ifp2;
-	int dhcp, dhcp6, ra;
+#ifdef INET
+	int dhcp;
 	const struct dhcp_state *state;
+#endif
 #ifdef INET6
 	const struct dhcp6_state *d6_state;
+	int dhcp6, ra;
 #endif
 
-	dhcp = dhcp6 = ra = 0;
+#ifdef INET
+	dhcp = 0;
 	state = D_STATE(ifp);
+#endif
 #ifdef INET6
+	dhcp6 = ra = 0;
 	d6_state = D6_CSTATE(ifp);
 #endif
 	if (strcmp(reason, "TEST") == 0) {
+		if (1 == 2) {}
 #ifdef INET6
-		if (d6_state && d6_state->new)
+		else if (d6_state && d6_state->new)
 			dhcp6 = 1;
 		else if (ipv6nd_has_ra(ifp))
 			ra = 1;
-		else
 #endif
+#ifdef INET
+		else
 			dhcp = 1;
-	} else if (reason[strlen(reason) - 1] == '6')
+#endif
+	}
+#ifdef INET6
+	else if (reason[strlen(reason) - 1] == '6')
 		dhcp6 = 1;
 	else if (strcmp(reason, "ROUTERADVERT") == 0)
 		ra = 1;
+#endif
+#ifdef INET
 	else
 		dhcp = 1;
+#endif
 
 	/* When dumping the lease, we only want to report interface and
 	   reason - the other interface variables are meaningless */
 	if (ifp->ctx->options & DHCPCD_DUMPLEASE)
 		elen = 2;
 	else
-		elen = 10;
+		elen = 11;
 
 #define EMALLOC(i, l) if ((env[(i)] = malloc(l)) == NULL) goto eexit;
 	/* Make our env */
@@ -263,19 +289,23 @@ make_env(const struct interface *ifp, co
 	EMALLOC(2, e);
 	snprintf(env[2], e, "pid=%d", getpid());
 	EMALLOC(3, e);
-	snprintf(env[3], e, "ifmetric=%d", ifp->metric);
+	snprintf(env[3], e, "ifcarrier=%s",
+	    ifp->carrier == LINK_UNKNOWN ? "unknown" :
+	    ifp->carrier == LINK_UP ? "up" : "down");
 	EMALLOC(4, e);
-	snprintf(env[4], e, "ifwireless=%d", ifp->wireless);
+	snprintf(env[4], e, "ifmetric=%d", ifp->metric);
 	EMALLOC(5, e);
-	snprintf(env[5], e, "ifflags=%u", ifp->flags);
+	snprintf(env[5], e, "ifwireless=%d", ifp->wireless);
 	EMALLOC(6, e);
-	snprintf(env[6], e, "ifmtu=%d", get_mtu(ifp->name));
+	snprintf(env[6], e, "ifflags=%u", ifp->flags);
+	EMALLOC(7, e);
+	snprintf(env[7], e, "ifmtu=%d", get_mtu(ifp->name));
 	l = e = strlen("interface_order=");
 	TAILQ_FOREACH(ifp2, ifp->ctx->ifaces, next) {
 		e += strlen(ifp2->name) + 1;
 	}
-	EMALLOC(7, e);
-	p = env[7];
+	EMALLOC(8, e);
+	p = env[8];
 	strlcpy(p, "interface_order=", e);
 	e -= l;
 	p += l;
@@ -288,22 +318,25 @@ make_env(const struct interface *ifp, co
 	}
 	*--p = '\0';
 	if (strcmp(reason, "TEST") == 0) {
-		env[8] = strdup("if_up=false");
-		env[9] = strdup("if_down=false");
-	} else if ((dhcp && state && state->new)
+		env[9] = strdup("if_up=false");
+		env[10] = strdup("if_down=false");
+	} else if (1 == 2 /* appease ifdefs */
+#ifdef INET
+	    || (dhcp && state && state->new)
+#endif
 #ifdef INET6
 	    || (dhcp6 && d6_state && d6_state->new)
 	    || (ra && ipv6nd_has_ra(ifp))
 #endif
 	    )
 	{
-		env[8] = strdup("if_up=true");
-		env[9] = strdup("if_down=false");
+		env[9] = strdup("if_up=true");
+		env[10] = strdup("if_down=false");
 	} else {
-		env[8] = strdup("if_up=false");
-		env[9] = strdup("if_down=true");
+		env[9] = strdup("if_up=false");
+		env[10] = strdup("if_down=true");
 	}
-	if (env[8] == NULL || env[9] == NULL)
+	if (env[9] == NULL || env[10] == NULL)
 		goto eexit;
 	if (*ifp->profile) {
 		e = strlen("profile=") + strlen(ifp->profile) + 2;
@@ -319,8 +352,7 @@ make_env(const struct interface *ifp, co
 			env = nenv;
 			EMALLOC(elen, e);
 			snprintf(env[elen++], e, "new_ssid=%s", ifp->ssid);
-		}
-		else if (strcmp(reason, "NOCARRIER") == 0) {
+		} else if (strcmp(reason, "NOCARRIER") == 0) {
 			nenv = realloc(env, sizeof(char *) * (elen + 2));
 			if (nenv == NULL)
 				goto eexit;
@@ -441,10 +473,12 @@ dumplease:
 
 eexit:
 	syslog(LOG_ERR, "%s: %m", __func__);
-	nenv = env;
-	while (*nenv)
-		free(*nenv++);
-	free(env);
+	if (env) {
+		nenv = env;
+		while (*nenv)
+			free(*nenv++);
+		free(env);
+	}
 	return -1;
 }
 

Reply via email to