← Commit list

25f3b737d

Denys Vlasenko
Denys Vlasenko
2017-10-22
SUCCESS Duration: 143s

Subject

hush: fix comment parsing in `cmd`, closes 10421

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-parsing/comment2.right+4 -0
@@ -0,0 +1,4 @@
+Ok1
+Ok2
+Ok5
+Ok6
shell/ash_test/ash-parsing/comment2.tests+13 -0
@@ -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
+)
shell/hush.c+13 -4
@@ -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;
shell/hush_test/hush-parsing/comment2.right+4 -0
@@ -0,0 +1,4 @@
+Ok1
+Ok2
+Ok5
+Ok6
shell/hush_test/hush-parsing/comment2.tests+13 -0
@@ -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
+)