diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-09-06 13:46:03 +0400 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-09-06 13:46:03 +0400 |
commit | c3adfacd229dd94b1ee4800fb364d514eef4aca5 (patch) | |
tree | 1245cc6f1915bfe6af65fd152962fff889fda78d | |
parent | 77b32ccbf2a1a77911b486b673008a4cb82bb8b7 (diff) |
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>
-rw-r--r-- | shell/hush.c | 10 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/heredoc_backslash1.right | 8 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/heredoc_backslash1.tests | 8 |
3 files changed, 24 insertions, 2 deletions
diff --git a/shell/hush.c b/shell/hush.c index e8aef2d7e..4e29f01a1 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -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; } } diff --git a/shell/hush_test/hush-misc/heredoc_backslash1.right b/shell/hush_test/hush-misc/heredoc_backslash1.right index 234c0172f..2633908fb 100644 --- a/shell/hush_test/hush-misc/heredoc_backslash1.right +++ b/shell/hush_test/hush-misc/heredoc_backslash1.right @@ -1,12 +1,16 @@ 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 @@ -14,12 +18,16 @@ cEOF2 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-\*-\?- cEOF4 diff --git a/shell/hush_test/hush-misc/heredoc_backslash1.tests b/shell/hush_test/hush-misc/heredoc_backslash1.tests index b70467df8..22045d42e 100755 --- a/shell/hush_test/hush-misc/heredoc_backslash1.tests +++ b/shell/hush_test/hush-misc/heredoc_backslash1.tests @@ -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\ |