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;
|