hush: fix another corner case with backslashes in heredocs
No binary (build failed)
—
(log yok)
| @@ -3174,6 +3174,7 @@ static char *fetch_till_str(o_string *as_string, | |
| ch = i_getch(input); | |
| nommu_addchr(as_string, ch); | |
| if (ch == '\n' | |
| + | /* TODO: or EOF? (heredoc delimiter may end with <eof>, not only <eol> */ |
| && ((heredoc_flags & HEREDOC_QUOTED) || prev != '\\') | |
| ) { | |
| if (strcmp(heredoc.data + past_EOL, word) == 0) { | |
| @@ -3182,7 +3183,8 @@ static char *fetch_till_str(o_string *as_string, | |
| return heredoc.data; | |
| } | |
| do { | |
| - | o_addchr(&heredoc, ch); |
| + | o_addchr(&heredoc, '\n'); |
| + | prev = 0; /* not \ */ |
| past_EOL = heredoc.length; | |
| jump_in: | |
| do { | |
| @@ -3196,8 +3198,12 @@ static char *fetch_till_str(o_string *as_string, | |
| return NULL; | |
| } | |
| o_addchr(&heredoc, ch); | |
| + | if (prev == '\\' && ch == '\\') |
| + | /* Correctly handle foo\\<eol> (not a line cont.) */ |
| + | prev = 0; /* not \ */ |
| + | else |
| + | prev = ch; |
| nommu_addchr(as_string, ch); | |
| - | prev = ch; |
| } | |
| } | |
| @@ -1,18 +1,24 @@ | |
| Quoted heredoc: | |
| a\ | |
| b | |
| + | a\\ |
| + | b |
| 123456 -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| c\ | |
| Unquoted heredoc: | |
| a b | |
| + | a\ |
| + | b |
| 123456 -qwerty-\t-\-\"-\'-`-\--\z-\*-\?- | |
| -qwerty-\t-\-\"-\'-`-\--\z-\*-\?- | |
| cEOF2 | |
| Quoted -heredoc: | |
| a\ | |
| + | b |
| + | a\\ |
| b | |
| 123456 -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| @@ -20,6 +26,8 @@ c\ | |
| Unquoted -heredoc: | |
| a b | |
| + | a\ |
| + | b |
| 123456 -qwerty-\t-\-\"-\'-`-\--\z-\*-\?- | |
| -qwerty-\t-\-\"-\'-`-\--\z-\*-\?- | |
| cEOF4 | |
| @@ -7,6 +7,8 @@ echo Quoted heredoc: | |
| cat <<"EOF1" | |
| a\ | |
| b | |
| + | a\\ |
| + | b |
| 123456 -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| c\ | |
| @@ -17,6 +19,8 @@ echo Unquoted heredoc: | |
| cat <<EOF2 | |
| a\ | |
| b | |
| + | a\\ |
| + | b |
| 123456 -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| c\ | |
| @@ -28,6 +32,8 @@ echo Quoted -heredoc: | |
| cat <<-"EOF3" | |
| a\ | |
| b | |
| + | a\\ |
| + | b |
| 123456 -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| c\ | |
| @@ -39,6 +45,8 @@ echo Unquoted -heredoc: | |
| cat <<-EOF4 | |
| a\ | |
| b | |
| + | a\\ |
| + | b |
| 123456 -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| -$a-\t-\\-\"-\'-\`-\--\z-\*-\?- | |
| c\ | |