aboutsummaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-09-06 11:46:03 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2010-09-06 11:46:03 +0200
commitc3adfacd229dd94b1ee4800fb364d514eef4aca5 (patch)
tree1245cc6f1915bfe6af65fd152962fff889fda78d /shell/hush.c
parent77b32ccbf2a1a77911b486b673008a4cb82bb8b7 (diff)
downloadbusybox-w32-c3adfacd229dd94b1ee4800fb364d514eef4aca5.tar.gz
busybox-w32-c3adfacd229dd94b1ee4800fb364d514eef4aca5.tar.bz2
busybox-w32-c3adfacd229dd94b1ee4800fb364d514eef4aca5.zip
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 e8aef2d7e..4e29f01a1 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -3174,6 +3174,7 @@ static char *fetch_till_str(o_string *as_string,
3174 ch = i_getch(input); 3174 ch = i_getch(input);
3175 nommu_addchr(as_string, ch); 3175 nommu_addchr(as_string, ch);
3176 if (ch == '\n' 3176 if (ch == '\n'
3177 /* TODO: or EOF? (heredoc delimiter may end with <eof>, not only <eol> */
3177 && ((heredoc_flags & HEREDOC_QUOTED) || prev != '\\') 3178 && ((heredoc_flags & HEREDOC_QUOTED) || prev != '\\')
3178 ) { 3179 ) {
3179 if (strcmp(heredoc.data + past_EOL, word) == 0) { 3180 if (strcmp(heredoc.data + past_EOL, word) == 0) {
@@ -3182,7 +3183,8 @@ static char *fetch_till_str(o_string *as_string,
3182 return heredoc.data; 3183 return heredoc.data;
3183 } 3184 }
3184 do { 3185 do {
3185 o_addchr(&heredoc, ch); 3186 o_addchr(&heredoc, '\n');
3187 prev = 0; /* not \ */
3186 past_EOL = heredoc.length; 3188 past_EOL = heredoc.length;
3187 jump_in: 3189 jump_in:
3188 do { 3190 do {
@@ -3196,8 +3198,12 @@ static char *fetch_till_str(o_string *as_string,
3196 return NULL; 3198 return NULL;
3197 } 3199 }
3198 o_addchr(&heredoc, ch); 3200 o_addchr(&heredoc, ch);
3201 if (prev == '\\' && ch == '\\')
3202 /* Correctly handle foo\\<eol> (not a line cont.) */
3203 prev = 0; /* not \ */
3204 else
3205 prev = ch;
3199 nommu_addchr(as_string, ch); 3206 nommu_addchr(as_string, ch);
3200 prev = ch;
3201 } 3207 }
3202} 3208}
3203 3209