[git commit] ash: [SHELL] Expand ENV before using it

Denys Vlasenko vda.linux at googlemail.com
Thu Oct 27 09:28:59 UTC 2016


commit: https://git.busybox.net/busybox/commit/?id=2eb0a7e1b9a579ba34e4780c9ed8e74f38bc6b85
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Upstream commit:

    Date: Sun, 13 Jul 2008 21:51:52 +0800
    [SHELL] Expand ENV before using it

    Per POSIX ENV needs to undergo parameter expansion.

    Signed-off-by: Herbert Xu <herbert at gondor.apana.org.au>

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c  | 17 +++++++----------
 shell/hush.c |  1 +
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index 864b8f0..0dd440c 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -13277,11 +13277,12 @@ procargs(char **argv)
 }
 
 /*
- * Read /etc/profile or .profile.
+ * Read /etc/profile, ~/.profile, $ENV.
  */
 static void
 read_profile(const char *name)
 {
+	name = expandstr(name);
 	if (setinputfile(name, INPUT_PUSH_FILE | INPUT_NOFILE_OK) < 0)
 		return;
 	cmdloop(0);
@@ -13325,7 +13326,6 @@ extern int etext();
 int ash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int ash_main(int argc UNUSED_PARAM, char **argv)
 {
-	const char *shinit;
 	volatile smallint state;
 	struct jmploc jmploc;
 	struct stackmark smark;
@@ -13394,11 +13394,8 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
  state1:
 		state = 2;
 		hp = lookupvar("HOME");
-		if (hp) {
-			hp = concat_path_file(hp, ".profile");
-			read_profile(hp);
-			free((char*)hp);
-		}
+		if (hp)
+			read_profile("$HOME/.profile");
 	}
  state2:
 	state = 3;
@@ -13408,11 +13405,11 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
 #endif
 	 iflag
 	) {
-		shinit = lookupvar("ENV");
-		if (shinit != NULL && *shinit != '\0') {
+		const char *shinit = lookupvar("ENV");
+		if (shinit != NULL && *shinit != '\0')
 			read_profile(shinit);
-		}
 	}
+	popstackmark(&smark);
  state3:
 	state = 4;
 	if (minusc) {
diff --git a/shell/hush.c b/shell/hush.c
index d7a0d76..c80429d 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -8405,6 +8405,7 @@ int hush_main(int argc, char **argv)
 		 * "bash <script>" (which is never interactive (unless -i?))
 		 * sources $BASH_ENV here (without scanning $PATH).
 		 * If called as sh, does the same but with $ENV.
+		 * Also NB, per POSIX, $ENV should undergo parameter expansion.
 		 */
 		G.global_argc--;
 		G.global_argv++;


More information about the busybox-cvs mailing list