diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-10-22 15:55:48 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-10-22 15:55:48 +0200 |
commit | 25f3b737dc04bb84fb593ace33a5c360163bd4e4 (patch) | |
tree | 07fdb99bc3e583a752bd033d7506f3e3d4d64629 | |
parent | 045327a418d1cf0a99405ca0b70ed61b5c1a1869 (diff) | |
download | busybox-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.right | 4 | ||||
-rwxr-xr-x | shell/ash_test/ash-parsing/comment2.tests | 13 | ||||
-rw-r--r-- | shell/hush.c | 17 | ||||
-rw-r--r-- | shell/hush_test/hush-parsing/comment2.right | 4 | ||||
-rwxr-xr-x | shell/hush_test/hush-parsing/comment2.tests | 13 |
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 @@ | |||
1 | Ok1 | ||
2 | Ok2 | ||
3 | Ok5 | ||
4 | Ok6 | ||
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 @@ | |||
1 | echo "`echo Ok1 #comment is ignored`" | ||
2 | echo `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 | # | ||
10 | echo "$(echo Ok5 #comment is ignored | ||
11 | )" | ||
12 | echo $(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 @@ | |||
1 | Ok1 | ||
2 | Ok2 | ||
3 | Ok5 | ||
4 | Ok6 | ||
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 @@ | |||
1 | echo "`echo Ok1 #comment is ignored`" | ||
2 | echo `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 | # | ||
10 | echo "$(echo Ok5 #comment is ignored | ||
11 | )" | ||
12 | echo $(echo Ok6 #comment is ignored | ||
13 | ) | ||