hush: fix another corner case with backslashes in heredocs

function                                             old     new   delta
parse_stream                                        2395    2432     +37

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
Denys Vlasenko 2010-09-06 11:46:03 +02:00
parent 77b32ccbf2
commit c3adfacd22
3 changed files with 24 additions and 2 deletions

View File

@ -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;
}
}

View File

@ -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

View File

@ -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\