aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-10-22 15:55:48 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-10-22 15:55:48 +0200
commit25f3b737dc04bb84fb593ace33a5c360163bd4e4 (patch)
tree07fdb99bc3e583a752bd033d7506f3e3d4d64629
parent045327a418d1cf0a99405ca0b70ed61b5c1a1869 (diff)
downloadbusybox-w32-25f3b737dc04bb84fb593ace33a5c360163bd4e4.tar.gz
busybox-w32-25f3b737dc04bb84fb593ace33a5c360163bd4e4.tar.bz2
busybox-w32-25f3b737dc04bb84fb593ace33a5c360163bd4e4.zip
hush: fix comment parsing in `cmd`, closes 10421
function old new delta parse_stream 2692 2690 -2 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/ash_test/ash-parsing/comment2.right4
-rwxr-xr-xshell/ash_test/ash-parsing/comment2.tests13
-rw-r--r--shell/hush.c17
-rw-r--r--shell/hush_test/hush-parsing/comment2.right4
-rwxr-xr-xshell/hush_test/hush-parsing/comment2.tests13
5 files changed, 47 insertions, 4 deletions
diff --git a/shell/ash_test/ash-parsing/comment2.right b/shell/ash_test/ash-parsing/comment2.right
new file mode 100644
index 000000000..ee6e49a5a
--- /dev/null
+++ b/shell/ash_test/ash-parsing/comment2.right
@@ -0,0 +1,4 @@
1Ok1
2Ok2
3Ok5
4Ok6
diff --git a/shell/ash_test/ash-parsing/comment2.tests b/shell/ash_test/ash-parsing/comment2.tests
new file mode 100755
index 000000000..b7adad96a
--- /dev/null
+++ b/shell/ash_test/ash-parsing/comment2.tests
@@ -0,0 +1,13 @@
1echo "`echo Ok1 #comment is ignored`"
2echo `echo Ok2 #comment is ignored`
3#
4# Surprisingly, bash does not handle comments in $()
5# the same way as in ``. "#" causes the rest of the line, _including_ )",
6# to be ignored. These lines would cause an error:
7#echo "$(echo Ok3 #comment is ignored)"
8#echo $(echo Ok4 #comment is ignored)
9#
10echo "$(echo Ok5 #comment is ignored
11)"
12echo $(echo Ok6 #comment is ignored
13)
diff --git a/shell/hush.c b/shell/hush.c
index d27550ba0..708555ac4 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -5140,14 +5140,23 @@ static struct pipe *parse_stream(char **pstring,
5140 case '#': 5140 case '#':
5141 if (dest.length == 0 && !dest.has_quoted_part) { 5141 if (dest.length == 0 && !dest.has_quoted_part) {
5142 /* skip "#comment" */ 5142 /* skip "#comment" */
5143 /* note: we do not add it to &ctx.as_string */
5144/* TODO: in bash:
5145 * comment inside $() goes to the next \n, even inside quoted string (!):
5146 * cmd "$(cmd2 #comment)" - syntax error
5147 * cmd "`cmd2 #comment`" - ok
5148 * We accept both (comment ends where command subst ends, in both cases).
5149 */
5143 while (1) { 5150 while (1) {
5144 ch = i_peek(input); 5151 ch = i_peek(input);
5145 if (ch == EOF || ch == '\n') 5152 if (ch == '\n') {
5153 nommu_addchr(&ctx.as_string, '\n');
5154 break;
5155 }
5156 ch = i_getch(input);
5157 if (ch == EOF)
5146 break; 5158 break;
5147 i_getch(input);
5148 /* note: we do not add it to &ctx.as_string */
5149 } 5159 }
5150 nommu_addchr(&ctx.as_string, '\n');
5151 continue; /* back to top of while (1) */ 5160 continue; /* back to top of while (1) */
5152 } 5161 }
5153 break; 5162 break;
diff --git a/shell/hush_test/hush-parsing/comment2.right b/shell/hush_test/hush-parsing/comment2.right
new file mode 100644
index 000000000..ee6e49a5a
--- /dev/null
+++ b/shell/hush_test/hush-parsing/comment2.right
@@ -0,0 +1,4 @@
1Ok1
2Ok2
3Ok5
4Ok6
diff --git a/shell/hush_test/hush-parsing/comment2.tests b/shell/hush_test/hush-parsing/comment2.tests
new file mode 100755
index 000000000..b7adad96a
--- /dev/null
+++ b/shell/hush_test/hush-parsing/comment2.tests
@@ -0,0 +1,13 @@
1echo "`echo Ok1 #comment is ignored`"
2echo `echo Ok2 #comment is ignored`
3#
4# Surprisingly, bash does not handle comments in $()
5# the same way as in ``. "#" causes the rest of the line, _including_ )",
6# to be ignored. These lines would cause an error:
7#echo "$(echo Ok3 #comment is ignored)"
8#echo $(echo Ok4 #comment is ignored)
9#
10echo "$(echo Ok5 #comment is ignored
11)"
12echo $(echo Ok6 #comment is ignored
13)