diff options
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/shell/hush.c b/shell/hush.c index 75bce33..c26484b 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -4250,6 +4250,7 @@ static char *fetch_till_str(o_string *as_string, if (ch == '\n' || ch == EOF) { check_heredoc_end: if ((heredoc_flags & HEREDOC_QUOTED) || prev != '\\') { + /* End-of-line, and not a line continuation */ if (strcmp(heredoc.data + past_EOL, word) == 0) { heredoc.data[past_EOL] = '\0'; debug_printf_heredoc("parsed '%s' heredoc '%s'\n", word, heredoc.data); @@ -4275,17 +4276,32 @@ static char *fetch_till_str(o_string *as_string, if (ch == '\n') goto check_heredoc_end; } + } else { + /* Backslash-line continuation in an unquoted + * heredoc. This does not need special handling + * for heredoc body (unquoted heredocs are + * expanded on "execution" and that would take + * care of this case too), but not the case + * of line continuation *in terminator*: + * cat <<EOF + * Ok1 + * EO\ + * F + */ + heredoc.data[--heredoc.length] = '\0'; + prev = 0; /* not '\' */ + continue; } } if (ch == EOF) { o_free(&heredoc); - return NULL; + return NULL; /* error */ } o_addchr(&heredoc, ch); nommu_addchr(as_string, ch); if (prev == '\\' && ch == '\\') /* Correctly handle foo\\<eol> (not a line cont.) */ - prev = 0; /* not \ */ + prev = 0; /* not '\' */ else prev = ch; } |