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 /shell | |
| 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>
Diffstat (limited to 'shell')
| -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 | ) | ||
