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