aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-05-24 12:18:16 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-05-24 12:18:16 +0000
commitb055001b6a69cf8fd513d36622cf693ee20c0e92 (patch)
tree13b92d347774d453d227b2f29dee695974a8727d /shell
parent90e485ce79b8a0cd345bc5be76100291ec589579 (diff)
downloadbusybox-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.c12
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 */
428static void syntax(const char *msg) 428static 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 */
434static void syntax_lineno(int line) 435static 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;