ash: fix prompt expansion (Natanael Copa <natanael.copa@gmail.com>)
[people/mcb30/busybox.git] / shell / ash.c
index 167232c..a3bfe39 100644 (file)
@@ -2494,6 +2494,7 @@ pwdcmd(int argc, char **argv)
 #define DQSYNTAX   1    /* in double quotes */
 #define SQSYNTAX   2    /* in single quotes */
 #define ARISYNTAX  3    /* in arithmetic */
+#define PSSYNTAX   4    /* prompt */
 
 #if ENABLE_ASH_OPTIMIZE_FOR_SIZE
 #define USE_SIT_FUNCTION
@@ -9886,6 +9887,9 @@ readtoken1(int firstc, int syntax, char *eofmark, int striptabs)
        smallint dblquote;
        smallint oldstyle;
        smallint prevsyntax; /* syntax before arithmetic */
+#if ENABLE_ASH_EXPAND_PRMT
+       smallint pssyntax;   /* we are expanding a prompt string */
+#endif
        int varnest;         /* levels of variables expansion */
        int arinest;         /* levels of arithmetic expansion */
        int parenlevel;      /* levels of parens in arithmetic */
@@ -9907,9 +9911,14 @@ readtoken1(int firstc, int syntax, char *eofmark, int striptabs)
        startlinno = plinno;
        bqlist = NULL;
        quotef = 0;
-       dblquote = (syntax == DQSYNTAX);
        oldstyle = 0;
        prevsyntax = 0;
+#if ENABLE_ASH_EXPAND_PRMT
+       pssyntax = (syntax == PSSYNTAX);
+       if (pssyntax)
+               syntax = DQSYNTAX;
+#endif
+       dblquote = (syntax == DQSYNTAX);
        varnest = 0;
        arinest = 0;
        parenlevel = 0;
@@ -9948,6 +9957,12 @@ readtoken1(int firstc, int syntax, char *eofmark, int striptabs)
                                        if (doprompt)
                                                setprompt(2);
                                } else {
+#if ENABLE_ASH_EXPAND_PRMT
+                                       if (c == '$' && pssyntax) {
+                                               USTPUTC(CTLESC, out);
+                                               USTPUTC('\\', out);
+                                       }
+#endif
                                        if (dblquote &&
                                                c != '\\' && c != '`' &&
                                                c != '$' && (
@@ -10780,7 +10795,7 @@ expandstr(const char *ps)
 
        /* XXX Fix (char *) cast. */
        setinputstring((char *)ps);
-       readtoken1(pgetc(), DQSYNTAX, nullstr, 0);
+       readtoken1(pgetc(), PSSYNTAX, nullstr, 0);
        popfile();
 
        n.narg.type = NARG;