ash: [SHELL] Expand ENV before using it
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 27 Oct 2016 09:28:59 +0000 (11:28 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 27 Oct 2016 09:28:59 +0000 (11:28 +0200)
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>
shell/ash.c
shell/hush.c

index 864b8f0a4f75f1ebb07edb2e0590ae2ac941554d..0dd440c61a630d0bf613e22f98883ce66e9bfd78 100644 (file)
@@ -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) {
index d7a0d761e171c49b29f171593f405d69510332a8..c80429d5c3ce7950e14c03a33c04f9f9565b8485 100644 (file)
@@ -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++;