summaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko2010-09-06 11:46:03 +0200
committerDenys Vlasenko2010-09-06 11:46:03 +0200
commitc3adfacd229dd94b1ee4800fb364d514eef4aca5 (patch)
tree1245cc6f1915bfe6af65fd152962fff889fda78d /shell/hush.c
parent77b32ccbf2a1a77911b486b673008a4cb82bb8b7 (diff)
downloadbusybox-c3adfacd229dd94b1ee4800fb364d514eef4aca5.zip
busybox-c3adfacd229dd94b1ee4800fb364d514eef4aca5.tar.gz
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>
Diffstat (limited to 'shell/hush.c')
-rw-r--r--shell/hush.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/shell/hush.c b/shell/hush.c
index e8aef2d..4e29f01 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;
}
}