ash: 'nolog' and 'debug' options cause "$-" to wreak havoc
authorMartijn Dekker <martijn@inlv.org>
Sat, 31 Mar 2018 16:15:59 +0000 (18:15 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 31 Mar 2018 16:30:27 +0000 (18:30 +0200)
Upstream commit:

    Date:   Tue Mar 6 17:40:37 2018 +0000
    expand: 'nolog' and 'debug' options cause "$-" to wreak havoc

    Op 29-03-17 om 20:02 schreef Martijn Dekker:
    > Bug: if either the 'nolog' or the 'debug' option is set, trying to
    > expand "$-" silently aborts parsing of an entire argument.
    >
    > $ dash -o nolog -c 'set -fuC; echo "|$- are the options|"; set +o nolog; echo "|$- are the options|"'
    > |
    > |uCf are the options|
    > $ dash -o debug -c 'set -fuC; echo "|$- are the options|"; set +o debug; echo "|$- are the options|"'
    > |
    > |uCf are the options|

    This turned out to be easy to fix. The routine producing the "$-"
    expansion failed to skip options for which there is no option letter,
    but only a long-form name. In dash, 'nolog' and 'debug' are currently
    the only two such options. Patch below.

    - Martijn

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
In bbox ash, pipefail is the option which exhibited this.

Signed-off-by: Martijn Dekker <martijn@inlv.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index 8fb32c1ae682a435f55c75927a96df9da9feb383..2ed802d2e2ed1707752a9c7523c0ad07df46f461 100644 (file)
@@ -7192,7 +7192,7 @@ varvalue(char *name, int varflags, int flags, int *quotedp)
        case '-':
                expdest = makestrspace(NOPTS, expdest);
                for (i = NOPTS - 1; i >= 0; i--) {
-                       if (optlist[i]) {
+                       if (optlist[i] && optletters(i)) {
                                USTPUTC(optletters(i), expdest);
                                len++;
                        }