On Mon, Feb 19, 2018 at 11:13 PM, Harald van Dijk <[email protected]> wrote:
> On 2/18/18 11:50 PM, Harald van Dijk wrote:
>> On 2/14/18 11:50 PM, Harald van Dijk wrote:
>>> 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...
>>
>> There is a way to make it work: ensure sufficient memory is always
>> available. Instead of inserting CTLESC, which caused problems,
>> CTLQUOTEMARK+CTLQUOTEMARK can be inserted instead. It's effectively a no-op
>> here.
>
> It required one obvious additional trivial change to the CHECKSTRSPACE
> invocation, but with that added, the attached passed all testing I could
> think of. Does this look okay to include, did I miss something, or is there
> perhaps a better alternative?
I propose replacing this:
if (*p == (char)CTLESC) {
p++;
+ goto escape;
+ } else if (*p == '\\') {
+ if (inquotes) {
+escape:
+ if (notescaped)
+ *q++ = '\\';
+ } else {
+ /* naked back slash */
+ notescaped = 0;
+ goto copy;
+ }
with equivalent
if (*p == (char)CTLESC) {
p++;
+ goto escape;
+ }
+ if (*p == '\\') {
+ if (!inquotes) {
+ /* naked back slash */
+ notescaped = 0;
+ goto copy;
+ }
+escape:
+ if (notescaped)
+ *q++ = '\\';
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html