aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2020-02-26 02:45:09 -0600
committerRob Landley <rob@landley.net>2020-02-26 02:45:09 -0600
commit3b82917a49f9e5ec3f6d4868adeac35a52c5a06e (patch)
treeafea6268411473019c28714c08d2c881945fa84f
parent4034fd798d5bca3202e836afbb3cccf4380ba88f (diff)
downloadtoybox-3b82917a49f9e5ec3f6d4868adeac35a52c5a06e.tar.gz
Fix xclearenv() breakage pointed out by Derrick Pallas.
Toybox doesn't modify inherited environ[] (the same way we don't modify our inherited argv[]), so instead of freeing our allocated environ[] when we want to clear it we need to allocate a new environ[] in the else path (at a length compatible with the existing plumbing's add stride), set the first entry of _that_ to 0, and set toys.envc = 1 to record it's an alloced environ.
-rw-r--r--lib/env.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/lib/env.c b/lib/env.c
index 92cc811f..614a504c 100644
--- a/lib/env.c
+++ b/lib/env.c
@@ -2,7 +2,7 @@
#include "toys.h"
-// In libc, populated by start code,used by getenv() and exec() and friends.
+// In libc, populated by start code, used by getenv() and exec() and friends.
extern char **environ;
// Returns the number of bytes taken by the environment variables. For use
@@ -26,9 +26,8 @@ void xclearenv(void)
int i;
for (i = 0; environ[i]; i++) if (i>=toys.envc) free(environ[i]);
- free(environ);
- }
- toys.envc = 0;
+ } else environ = xmalloc(256*sizeof(char *));
+ toys.envc = 1;
*environ = 0;
}