summaryrefslogtreecommitdiff
path: root/extra/libbsd/spt.patch
blob: b19dc9b87115aa193522f1f147f47e75c605d7de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
diff -u -r libbsd-0.5.2-orig/src/setproctitle.c libbsd-0.5.2/src/setproctitle.c
--- libbsd-0.5.2-orig/src/setproctitle.c	2013-06-08 18:26:04.000000000 +0200
+++ libbsd-0.5.2/src/setproctitle.c	2013-06-18 02:35:59.441393418 +0200
@@ -86,7 +86,7 @@
 	if (environ != envp)
 		return 0;
 
-	/* Make a copy of the old environ array of pointers, in case
+	/* Make a deep copy of the old environ array of pointers, in case
 	 * clearenv() or setenv() is implemented to free the internal
 	 * environ array, because we will need to access the old environ
 	 * contents to make the new copy. */
@@ -94,11 +94,13 @@
 	envcopy = malloc(envsize);
 	if (envcopy == NULL)
 		return errno;
-	memcpy(envcopy, envp, envsize);
+	for (i = 0; envp[i]; i++) envcopy[i] = strdup(envp[i]);
+	envcopy[i] = NULL;
 
 	error = spt_clearenv();
 	if (error) {
 		environ = envp;
+		for(i = 0; envcopy[i]; i++) free(envcopy[i]);
 		free(envcopy);
 		return error;
 	}
@@ -116,18 +118,20 @@
 		if (error) {
 #ifdef HAVE_CLEARENV
 			/* Because the old environ might not be available
-			 * anymore we will make do with the shallow copy. */
+			 * anymore we will make do with the deep copy. */
 			environ = envcopy;
 #else
 			environ = envp;
+			for(i = 0; envcopy[i]; i++) free(envcopy[i]);
 			free(envcopy);
 #endif
 			return error;
 		}
 	}
 
-	/* Dispose of the shallow copy, now that we've finished transfering
+	/* Dispose of the deep copy, now that we've finished transfering
 	 * the old environment. */
+	for(i = 0; envcopy[i]; i++) free(envcopy[i]);
 	free(envcopy);
 
 	return 0;