On 3/6/18 9:45 AM, Herbert Xu wrote:
On Wed, Oct 12, 2016 at 07:24:26PM +0200, Harald van Dijk wrote:

I would have expected another exception to be in alias expansions that
end in a backslash. Shells are not entirely in agreement there, but most
appear to treat this the regular way, meaning

   dash -c 'alias bs=\\
   bs
   '

prints nothing.

I think your patch changes this.  In order to preserve the existing
behaviour (which seems logical), you should change the second pgetc
call in pgetc_eatbnl to pgetc2.

Oh, indeed, thanks.

There's another problem: when there is no following command (as in the above example), things break. A shorter reproducer that has failed for years is

  $ dash -c 'alias x=
  x'
  dash: 2: Syntax error: end of file unexpected

This breaks because the part where list() checks for NL/EOF, checkkwd==0, so aliases aren't expanded. Immediately after that, checkkwd is set and the next call to readtoken() would return TEOF, but by that point, dash has already committed to parsing a command.

Since this is actually a long-standing problem, not something introduced by the patch, I think it's okay to ignore for now. Do you agree?

With more extensive testing, the only issue I've seen is what Jilles
Tjoelker had already mentioned, namely that backslash-newline should be
preserved inside single-quoted strings, and also that it should be
preserved inside heredocs where any part of the delimiter is quoted:

    cat <<\EOF
    \
    EOF

dash's parsing treats this mostly the same as a single-quoted string,
and the same extra check handles both cases.

Here's an updated patch. Hoping this looks okay and can be applied.


I'm fine with the concept.  However, your patch also breaks here-
document parsing when the delimiter is a single backslash.

        cat << "\"
        \
>
If you can fix these two problems it should be good to go.

As Martijn Dekker wrote, this should work when the backslash is escaped or single-quoted, and in my testing does. But what you have is a nice start of another corner case:

  cat << "\"
  \
  "EOF
  ok
  "
  EOF

I'm happily surprised to see that dash accepts and gives sensible treatment to multi-line heredoc delimiters.

Okay with your one extra pgetc()=>pgetc2() change, then?

Cheers,
Harald van Dijk

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

Reply via email to