diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2021-06-15 16:05:57 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-06-15 16:46:30 +0200 |
commit | 1b7a9b68d0e9aa19147d7fda16eb9a6b54156985 (patch) | |
tree | 5e35a487488b39a21b2d81cc2805d4241cbb5a8e /shell/hush.c | |
parent | 04f052c56ded5ab6a904e3a264a73dc0412b2e78 (diff) | |
download | busybox-w32-1b7a9b68d0e9aa19147d7fda16eb9a6b54156985.tar.gz busybox-w32-1b7a9b68d0e9aa19147d7fda16eb9a6b54156985.tar.bz2 busybox-w32-1b7a9b68d0e9aa19147d7fda16eb9a6b54156985.zip |
hush: fix handling of \^C and "^C"
function old new delta
parse_stream 2238 2252 +14
encode_string 243 256 +13
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 27/0) Total: 27 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/shell/hush.c b/shell/hush.c index 741f93589..e271c04d6 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -5237,6 +5237,11 @@ static int encode_string(o_string *as_string, | |||
5237 | } | 5237 | } |
5238 | #endif | 5238 | #endif |
5239 | o_addQchr(dest, ch); | 5239 | o_addQchr(dest, ch); |
5240 | if (ch == SPECIAL_VAR_SYMBOL) { | ||
5241 | /* Convert "^C" to corresponding special variable reference */ | ||
5242 | o_addchr(dest, SPECIAL_VAR_QUOTED_SVS); | ||
5243 | o_addchr(dest, SPECIAL_VAR_SYMBOL); | ||
5244 | } | ||
5240 | goto again; | 5245 | goto again; |
5241 | #undef as_string | 5246 | #undef as_string |
5242 | } | 5247 | } |
@@ -5348,6 +5353,11 @@ static struct pipe *parse_stream(char **pstring, | |||
5348 | if (ch == '\n') | 5353 | if (ch == '\n') |
5349 | continue; /* drop \<newline>, get next char */ | 5354 | continue; /* drop \<newline>, get next char */ |
5350 | nommu_addchr(&ctx.as_string, '\\'); | 5355 | nommu_addchr(&ctx.as_string, '\\'); |
5356 | if (ch == SPECIAL_VAR_SYMBOL) { | ||
5357 | nommu_addchr(&ctx.as_string, ch); | ||
5358 | /* Convert \^C to corresponding special variable reference */ | ||
5359 | goto case_SPECIAL_VAR_SYMBOL; | ||
5360 | } | ||
5351 | o_addchr(&ctx.word, '\\'); | 5361 | o_addchr(&ctx.word, '\\'); |
5352 | if (ch == EOF) { | 5362 | if (ch == EOF) { |
5353 | /* Testcase: eval 'echo Ok\' */ | 5363 | /* Testcase: eval 'echo Ok\' */ |
@@ -5672,6 +5682,7 @@ static struct pipe *parse_stream(char **pstring, | |||
5672 | /* Note: nommu_addchr(&ctx.as_string, ch) is already done */ | 5682 | /* Note: nommu_addchr(&ctx.as_string, ch) is already done */ |
5673 | 5683 | ||
5674 | switch (ch) { | 5684 | switch (ch) { |
5685 | case_SPECIAL_VAR_SYMBOL: | ||
5675 | case SPECIAL_VAR_SYMBOL: | 5686 | case SPECIAL_VAR_SYMBOL: |
5676 | /* Convert raw ^C to corresponding special variable reference */ | 5687 | /* Convert raw ^C to corresponding special variable reference */ |
5677 | o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL); | 5688 | o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL); |