summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMartijn Dekker <martijn@inlv.org>2018-03-06 17:40:37 +0000
committerHerbert Xu <herbert@gondor.apana.org.au>2018-03-10 16:01:43 +0800
commit81a501b7fbcff8da004251a85a8f948263254aa5 (patch)
tree6b602b223b1ada208dc6718bc91a5fcf3c0d776d /src
parenthistedit: fix build with musl libc (diff)
downloaddash-81a501b7fbcff8da004251a85a8f948263254aa5.tar.gz
dash-81a501b7fbcff8da004251a85a8f948263254aa5.zip
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>
Diffstat (limited to 'src')
-rw-r--r--src/expand.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/expand.c b/src/expand.c
index 1ab5757..adcb70e 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -927,7 +927,7 @@ numvar:
 	case '-':
 		p = makestrspace(NOPTS, expdest);
 		for (i = NOPTS - 1; i >= 0; i--) {
-			if (optlist[i]) {
+			if (optlist[i] && optletters[i]) {
 				USTPUTC(optletters[i], p);
 				len++;
 			}