diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-05-24 12:18:16 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-05-24 12:18:16 +0000 |
commit | b055001b6a69cf8fd513d36622cf693ee20c0e92 (patch) | |
tree | 13b92d347774d453d227b2f29dee695974a8727d /shell | |
parent | 90e485ce79b8a0cd345bc5be76100291ec589579 (diff) | |
download | busybox-w32-b055001b6a69cf8fd513d36622cf693ee20c0e92.tar.gz busybox-w32-b055001b6a69cf8fd513d36622cf693ee20c0e92.tar.bz2 busybox-w32-b055001b6a69cf8fd513d36622cf693ee20c0e92.zip |
hush: fix handling of unmatched ${name (without closing '}') -
was eating all remaining input, potentially megabytes.
nofork: save/restore die_jmp too
nofork: use -2222 instead of -111 as "special" return valur for zero
(-111 is used by some applets. -2222 won't fit in exitcode and thus safer)
Diffstat (limited to 'shell')
-rw-r--r-- | shell/hush.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/shell/hush.c b/shell/hush.c index 579950ff9..1ff7b0df6 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -427,13 +427,15 @@ enum { run_list_level = 0 }; | |||
427 | /* Normal */ | 427 | /* Normal */ |
428 | static void syntax(const char *msg) | 428 | static void syntax(const char *msg) |
429 | { | 429 | { |
430 | bb_error_msg(msg ? "%s: %s" : "syntax error", "syntax error", msg); | 430 | (interactive_fd ? bb_error_msg : bb_error_msg_and_die) |
431 | (msg ? "%s: %s" : "syntax error", "syntax error", msg); | ||
431 | } | 432 | } |
432 | #else | 433 | #else |
433 | /* Debug */ | 434 | /* Debug */ |
434 | static void syntax_lineno(int line) | 435 | static void syntax_lineno(int line) |
435 | { | 436 | { |
436 | bb_error_msg("syntax error hush.c:%d", line); | 437 | (interactive_fd ? bb_error_msg : bb_error_msg_and_die) |
438 | ("syntax error hush.c:%d", line); | ||
437 | } | 439 | } |
438 | #define syntax(str) syntax_lineno(__LINE__) | 440 | #define syntax(str) syntax_lineno(__LINE__) |
439 | #endif | 441 | #endif |
@@ -3309,13 +3311,13 @@ static int handle_dollar(o_string *dest, struct p_context *ctx, struct in_str *i | |||
3309 | /* XXX maybe someone will try to escape the '}' */ | 3311 | /* XXX maybe someone will try to escape the '}' */ |
3310 | while (1) { | 3312 | while (1) { |
3311 | ch = b_getch(input); | 3313 | ch = b_getch(input); |
3312 | if (ch == EOF) { | 3314 | if (ch == '}') |
3315 | break; | ||
3316 | if (!isalnum(ch) && ch != '_') { | ||
3313 | syntax("unterminated ${name}"); | 3317 | syntax("unterminated ${name}"); |
3314 | debug_printf_parse("handle_dollar return 1: unterminated ${name}\n"); | 3318 | debug_printf_parse("handle_dollar return 1: unterminated ${name}\n"); |
3315 | return 1; | 3319 | return 1; |
3316 | } | 3320 | } |
3317 | if (ch == '}') | ||
3318 | break; | ||
3319 | debug_printf_parse(": '%c'\n", ch); | 3321 | debug_printf_parse(": '%c'\n", ch); |
3320 | b_addchr(dest, ch | quote_mask); | 3322 | b_addchr(dest, ch | quote_mask); |
3321 | quote_mask = 0; | 3323 | quote_mask = 0; |