diff options
author | Denys Vlasenko | 2016-10-27 11:28:59 +0200 |
---|---|---|
committer | Denys Vlasenko | 2016-10-27 11:28:59 +0200 |
commit | 2eb0a7e1b9a579ba34e4780c9ed8e74f38bc6b85 (patch) | |
tree | d02a7697eafd348e66aa1ef17fc5334d7b8f950e /shell | |
parent | 70392331a98d266af539be4b910812fc7b0a72d4 (diff) | |
download | busybox-2eb0a7e1b9a579ba34e4780c9ed8e74f38bc6b85.zip busybox-2eb0a7e1b9a579ba34e4780c9ed8e74f38bc6b85.tar.gz |
ash: [SHELL] Expand ENV before using it
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@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 17 | ||||
-rw-r--r-- | 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++; |