[PATCH] Ash doesn't add env variables for sub-apps in nofork mode

Ian Wienand ianw at vmware.com
Wed Oct 15 22:46:11 UTC 2008


Hi,

Environment variables don't get set for sub-applications when ash is
built in standalone mode.

For example, build ls colors in as default, start up busybox ash and
run

$ export LS_COLORS=none
$ ls

and you can see the colors still come out (we found the issue with
TZ).

The problem is that the sub-application is calling getenv(), but the
variable has never been set in the shell environment.

Suggested patch below.  This doesn't fix the 'LS_COLORS=none ls' case,
but makes 'export' work as expected.

-i

Index: shell/ash.c
===================================================================
--- shell/ash.c	(revision 23678)
+++ shell/ash.c	(working copy)
@@ -12103,6 +12103,20 @@
 			do {
 				p = strchr(name, '=');
 				if (p != NULL) {
+#if ENABLE_FEATURE_SH_STANDALONE
+					/* If in standalone mode we
+					 * need to make sure that
+					 * sub-applications that call
+					 * getenv() see this variable
+					 * as being set, as they are
+					 * executed right in our
+					 * process. */
+					char *evar = xasprintf("%s", name);
+					char *eval = &evar[p - name + 1];
+					evar[p - name] = '\0';
+					setenv(evar, eval, 1);
+					free(evar);
+#endif
 					p++;
 				} else {
 					vp = *findvar(hashvar(name), name);
@@ -12152,6 +12166,11 @@
 
 	for (ap = argptr; *ap; ap++) {
 		if (flag != 'f') {
+#if ENABLE_FEATURE_SH_STANDALONE
+			/* Make sure this no longer appears if
+			 * sub-apps do getenv() */
+			unsetenv(*ap);
+#endif
 			i = unsetvar(*ap);
 			ret |= i;
 			if (!(i & 2))



More information about the busybox mailing list