hush: fix comment parsing in `cmd`, closes 10421
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 22 Oct 2017 13:55:48 +0000 (15:55 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 22 Oct 2017 13:55:48 +0000 (15:55 +0200)
function                                             old     new   delta
parse_stream                                        2692    2690      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash_test/ash-parsing/comment2.right [new file with mode: 0644]
shell/ash_test/ash-parsing/comment2.tests [new file with mode: 0755]
shell/hush.c
shell/hush_test/hush-parsing/comment2.right [new file with mode: 0644]
shell/hush_test/hush-parsing/comment2.tests [new file with mode: 0755]

diff --git a/shell/ash_test/ash-parsing/comment2.right b/shell/ash_test/ash-parsing/comment2.right
new file mode 100644 (file)
index 0000000..ee6e49a
--- /dev/null
@@ -0,0 +1,4 @@
+Ok1
+Ok2
+Ok5
+Ok6
diff --git a/shell/ash_test/ash-parsing/comment2.tests b/shell/ash_test/ash-parsing/comment2.tests
new file mode 100755 (executable)
index 0000000..b7adad9
--- /dev/null
@@ -0,0 +1,13 @@
+echo "`echo Ok1 #comment is ignored`"
+echo `echo Ok2 #comment is ignored`
+#
+# Surprisingly, bash does not handle comments in $()
+# the same way as in ``. "#" causes the rest of the line, _including_ )",
+# to be ignored. These lines would cause an error:
+#echo "$(echo Ok3 #comment is ignored)"
+#echo $(echo Ok4 #comment is ignored)
+#
+echo "$(echo Ok5 #comment is ignored
+)"
+echo $(echo Ok6 #comment is ignored
+)
index d27550ba066b7959ec7794a5199a0c1081756e34..708555ac4dd7d30225f3ab9b25b002a3fae89ac5 100644 (file)
@@ -5140,14 +5140,23 @@ static struct pipe *parse_stream(char **pstring,
                case '#':
                        if (dest.length == 0 && !dest.has_quoted_part) {
                                /* skip "#comment" */
+                               /* note: we do not add it to &ctx.as_string */
+/* TODO: in bash:
+ * comment inside $() goes to the next \n, even inside quoted string (!):
+ * cmd "$(cmd2 #comment)" - syntax error
+ * cmd "`cmd2 #comment`" - ok
+ * We accept both (comment ends where command subst ends, in both cases).
+ */
                                while (1) {
                                        ch = i_peek(input);
-                                       if (ch == EOF || ch == '\n')
+                                       if (ch == '\n') {
+                                               nommu_addchr(&ctx.as_string, '\n');
+                                               break;
+                                       }
+                                       ch = i_getch(input);
+                                       if (ch == EOF)
                                                break;
-                                       i_getch(input);
-                                       /* note: we do not add it to &ctx.as_string */
                                }
-                               nommu_addchr(&ctx.as_string, '\n');
                                continue; /* back to top of while (1) */
                        }
                        break;
diff --git a/shell/hush_test/hush-parsing/comment2.right b/shell/hush_test/hush-parsing/comment2.right
new file mode 100644 (file)
index 0000000..ee6e49a
--- /dev/null
@@ -0,0 +1,4 @@
+Ok1
+Ok2
+Ok5
+Ok6
diff --git a/shell/hush_test/hush-parsing/comment2.tests b/shell/hush_test/hush-parsing/comment2.tests
new file mode 100755 (executable)
index 0000000..b7adad9
--- /dev/null
@@ -0,0 +1,13 @@
+echo "`echo Ok1 #comment is ignored`"
+echo `echo Ok2 #comment is ignored`
+#
+# Surprisingly, bash does not handle comments in $()
+# the same way as in ``. "#" causes the rest of the line, _including_ )",
+# to be ignored. These lines would cause an error:
+#echo "$(echo Ok3 #comment is ignored)"
+#echo $(echo Ok4 #comment is ignored)
+#
+echo "$(echo Ok5 #comment is ignored
+)"
+echo $(echo Ok6 #comment is ignored
+)