diff mbox

dash bug: double-quoted "\" breaks glob protection for next char

Message ID 297b41c4-0e15-e0d8-f088-d68acfcc3c0f@gigawatt.nl (mailing list archive)
State Superseded
Delegated to: Herbert Xu
Headers show

Commit Message

Harald van Dijk Feb. 14, 2018, 9:44 p.m. UTC
On 2/14/18 9:03 PM, Harald van Dijk wrote:
> On 13/02/2018 14:53, Denys Vlasenko wrote:
>> $ >'\zzzz'
>> $ >'\wwww'
>> $ dash -c 'echo "\*"'
>> \wwww \zzzz
> 
>[...]
> 
> Currently:
> 
> $ dash -c 'foo=a; echo "<${foo#[a\]]}>"'
> <>
> 
> This is what I expect, and also what bash, ksh and posh do.
> 
> With your patch:
> 
> $ dash -c 'foo=a; echo "<${foo#[a\]]}>"'
> <a>

Does the attached look right as an alternative? It treats a quoted 
backslash the same way as if it were preceded by CTLESC in _rmescapes. 
It passes your test case and mine, but I'll do more extensive testing.

Cheers,
Harald van Dijk

Comments

Harald van Dijk Feb. 14, 2018, 10:50 p.m. UTC | #1
On 2/14/18 10:44 PM, Harald van Dijk wrote:
> On 2/14/18 9:03 PM, Harald van Dijk wrote:
>> On 13/02/2018 14:53, Denys Vlasenko wrote:
>>> $ >'\zzzz'
>>> $ >'\wwww'
>>> $ dash -c 'echo "\*"'
>>> \wwww \zzzz
>>
>> [...]
>>
>> Currently:
>>
>> $ dash -c 'foo=a; echo "<${foo#[a\]]}>"'
>> <>
>>
>> This is what I expect, and also what bash, ksh and posh do.
>>
>> With your patch:
>>
>> $ dash -c 'foo=a; echo "<${foo#[a\]]}>"'
>> <a>
> 
> Does the attached look right as an alternative? It treats a quoted 
> backslash the same way as if it were preceded by CTLESC in _rmescapes. 
> It passes your test case and mine, but I'll do more extensive testing.

It causes preglob's string to potentially grow larger than the original. 
When called with RMESCAPE_ALLOC, that can be handled by increasing the 
buffer size, but preglob also gets called without RMESCAPE_ALLOC to 
modify a string in-place. That's never going to work with this approach. 
Back to the drawing board...

Cheers,
Harald van Dijk
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/src/expand.c b/src/expand.c
index 2a50830..af88a69 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -1686,12 +1686,17 @@  _rmescapes(char *str, int flag)
 		}
 		if (*p == (char)CTLESC) {
 			p++;
-			if (notescaped)
-				*q++ = '\\';
-		} else if (*p == '\\' && !inquotes) {
-			/* naked back slash */
-			notescaped = 0;
-			goto copy;
+			goto escape;
+		} else if (*p == '\\') {
+			if (inquotes) {
+escape:
+				if (notescaped)
+					*q++ = '\\';
+			} else {
+				/* naked back slash */
+				notescaped = 0;
+				goto copy;
+			}
 		}
 		notescaped = globbing;
 copy: