summary refs log tree commit diff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2008-01-01 13:46:01 +1100
committerHerbert Xu <herbert@gondor.apana.org.au>2008-05-02 14:09:17 +0800
commit36f0fa8fcbc8c7b2b194addd29100fb40e73e4e9 (patch)
tree670befb7730b1ac930d02e7f2e3fdaf314ac4bf9
parent[PARSER] Do not show prompts in expandstr (diff)
downloaddash-36f0fa8fcbc8c7b2b194addd29100fb40e73e4e9.tar.gz
dash-36f0fa8fcbc8c7b2b194addd29100fb40e73e4e9.zip
[EXPAND] Fix slash treatment in expmeta
The change

   [EXPAND] Do not quote back slashes in parameter expansions outside quotes

triggered a latent bug in expmeta where the forward slashes when preceded
by a blackslash weren't recognised as directory separators.  This was hidden
because a work-around was put in place for glob(3) which meant that we never
had any backslashes immediately before forward slashes.

This patch fixes the metaflag loop to recognise forward slashes even when
they follow a backslash.

Thanks to Daniel Hahler for reporting this problem.

Test case:

	echo "/"root*

Old result:

	/root*

New result:

	/root

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--ChangeLog4
-rw-r--r--src/expand.c15
2 files changed, 12 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 0030738..4bc9181 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-01-01  Herbert Xu <herbert@gondor.apana.org.au>
+
+	* Fix slash treatment in expmeta.
+
 2007-12-27  Herbert Xu <herbert@gondor.apana.org.au>
 
 	* Add FAKEEOFMARK for expandstr.
diff --git a/src/expand.c b/src/expand.c
index f3d63c4..5986236 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -1287,15 +1287,16 @@ expmeta(char *enddir, char *name)
 					break;
 				}
 			}
-		} else if (*p == '\\')
-			p++;
-		else if (*p == '/') {
-			if (metaflag)
-				goto out;
-			start = p + 1;
+		} else {
+			if (*p == '\\')
+				p++;
+			if (*p == '/') {
+				if (metaflag)
+					break;
+				start = p + 1;
+			}
 		}
 	}
-out:
 	if (metaflag == 0) {	/* we've reached the end of the file name */
 		if (enddir != expdir)
 			metaflag++;