Module Name:    src
Committed By:   christos
Date:           Fri Sep 24 14:31:15 UTC 2010

Modified Files:
        src/lib/libc/stdlib: setenv.c

Log Message:
Fix memory leaks; thanks Enami!


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/lib/libc/stdlib/setenv.c

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

Modified files:

Index: src/lib/libc/stdlib/setenv.c
diff -u src/lib/libc/stdlib/setenv.c:1.34 src/lib/libc/stdlib/setenv.c:1.35
--- src/lib/libc/stdlib/setenv.c:1.34	Thu Sep 23 13:30:49 2010
+++ src/lib/libc/stdlib/setenv.c	Fri Sep 24 10:31:15 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: setenv.c,v 1.34 2010/09/23 17:30:49 christos Exp $	*/
+/*	$NetBSD: setenv.c,v 1.35 2010/09/24 14:31:15 christos Exp $	*/
 
 /*
  * Copyright (c) 1987, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)setenv.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: setenv.c,v 1.34 2010/09/23 17:30:49 christos Exp $");
+__RCSID("$NetBSD: setenv.c,v 1.35 2010/09/24 14:31:15 christos Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -81,7 +81,7 @@
 	c = __findenv(name, &offset);
 
 	if (__allocenv(offset) == -1)
-		return -1;
+		goto bad;
 
 	if (*value == '=')			/* no `=' in value */
 		++value;
@@ -90,7 +90,7 @@
 	if (c != NULL) {
 		if (!rewrite)
 			goto good;
-		if (strlen(c) > l_value)	/* old larger; copy over */
+		if (strlen(c) >= l_value)	/* old is enough; copy over */
 			goto copy;
 	} else {					/* create new slot */
 		size = (size_t)(sizeof(char *) * (offset + 2));
@@ -113,6 +113,8 @@
 	/* name + `=' + value */
 	if ((c = malloc(size + l_value + 2)) == NULL)
 		goto bad;
+	if (bit_test(__environ_malloced, offset))
+		free(environ[offset]);
 	environ[offset] = c;
 	(void)memcpy(c, name, size);
 	c += size;

Reply via email to