Re: ${var+set}, ${var:+nonempty} broken in current git

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Sep 02, 2018 at 10:15:50PM +0000, Martijn Dekker wrote:
> Commit 3cd538634f71538370f5af239f342aec48b7470b broke these:
> 
> $ src/dash -c 'unset var; echo ${var+set}'
> set
> $ src/dash -c 'var=; echo ${var:+nonempty}'
> nonempty

Thanks for the report! I forgot to discard the result of the unused
expansion.

---8<---
Subject: expand: Discard result of unused expansion in evalvar

The commit 3cd538634f71538370f5af239f342aec48b7470b broke parameter
expansion where the nested expanded word needs to be discarded.
This is because the EXP_DISCARD flag wasn't set where it should
have been:

	$ src/dash -c 'var=; echo ${var:+nonempty}'
	nonempty

This patch fixes it by setting it where needed.

Reported-by: Martijn Dekker <martijn@xxxxxxxx>
Fixes: 3cd538634f71 ("expand: Do not reprocess data when...")
Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>

diff --git a/src/expand.c b/src/expand.c
index 14daa63..e890052 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -698,6 +698,7 @@ evalvar(char *p, int flag)
 	int patloc;
 	int startloc;
 	ssize_t varlen;
+	int discard;
 	int quoted;
 
 	varflags = *p++;
@@ -713,21 +714,24 @@ again:
 	if (varflags & VSNUL)
 		varlen--;
 
+	discard = varlen < 0 ? EXP_DISCARD : 0;
+
 	switch (subtype) {
 	case VSPLUS:
-		varlen = -1 - varlen;
+		discard ^= EXP_DISCARD;
 		/* fall through */
 
 	case 0:
 	case VSMINUS:
-		p = argstr(p, flag | EXP_TILDE | EXP_WORD);
-		if (varlen < 0)
+		p = argstr(p, flag | EXP_TILDE | EXP_WORD |
+			      (discard ^ EXP_DISCARD));
+		if (discard)
 			return p;
 		goto record;
 
 	case VSASSIGN:
 	case VSQUESTION:
-		if (varlen >= 0)
+		if (!discard)
 			goto record;
 
 		p = subevalvar(p, var, 0, startloc, varflags,
@@ -740,7 +744,7 @@ again:
 		goto again;
 	}
 
-	if (varlen < 0 && uflag)
+	if (discard && uflag)
 		varunset(p, var, 0, 0);
 
 	if (subtype == VSLENGTH) {
@@ -765,7 +769,7 @@ again:
 	}
 #endif
 
-	flag |= varlen < 0 ? EXP_DISCARD : 0;
+	flag |= discard;
 	if (!(flag & EXP_DISCARD)) {
 		/*
 		 * Terminate the string and start recording the pattern
-- 
Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt



[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux