← Commit list

dfc739476

Denys Vlasenko
Denys Vlasenko
2018-07-24
SUCCESS Duration: 147s

Subject

hush: handle backslash-newline in heredoc terminators

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash_test/ash-heredoc/heredoc_bkslash_newline2.right+1 -0
@@ -0,0 +1 @@
+Ok1
shell/ash_test/ash-heredoc/heredoc_bkslash_newline2.tests+4 -0
@@ -0,0 +1,4 @@
+cat <<EOF
+Ok1
+EO\
+F
shell/hush.c+18 -2
@@ -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;
}
shell/hush_test/hush-heredoc/heredoc_bkslash_newline2.right+1 -0
@@ -0,0 +1 @@
+Ok1
shell/hush_test/hush-heredoc/heredoc_bkslash_newline2.tests+4 -0
@@ -0,0 +1,4 @@
+cat <<EOF
+Ok1
+EO\
+F