From f328e00b107564569ee31820a49540c5dbe34f73 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 2 Apr 2009 16:55:38 +0000 Subject: hush: do not inadvertently parse $((1 + "22")) as ok. -20 bytes code size --- shell/hush.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'shell/hush.c') diff --git a/shell/hush.c b/shell/hush.c index 64b6e87e8..0bddc9213 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -432,7 +432,7 @@ enum { CHAR_ORDINARY = 0, CHAR_ORDINARY_IF_QUOTED = 1, /* example: *, # */ CHAR_IFS = 2, /* treated as ordinary if quoted */ - CHAR_SPECIAL = 3, /* example: $ */ + CHAR_SPECIAL = 3, /* \, $, ", maybe ` */ }; enum { @@ -4160,17 +4160,7 @@ static int parse_stream_dquoted(o_string *dest, struct in_str *input, int dquote } debug_printf_parse(": ch=%c (%d) m=%d quote=%d\n", ch, ch, m, dest->o_quote); - if (m != CHAR_SPECIAL) { - o_addQchr(dest, ch); - if ((dest->o_assignment == MAYBE_ASSIGNMENT - || dest->o_assignment == WORD_IS_KEYWORD) - && ch == '=' - && is_assignment(dest->data) - ) { - dest->o_assignment = DEFINITELY_ASSIGNMENT; - } - goto again; - } + /* Basically, checking every CHAR_SPECIAL char except '"' */ if (ch == '\\') { if (next == EOF) { syntax("\\"); @@ -4208,9 +4198,17 @@ static int parse_stream_dquoted(o_string *dest, struct in_str *input, int dquote add_till_backquote(dest, input); o_addchr(dest, SPECIAL_VAR_SYMBOL); //debug_printf_subst("SUBST RES3 '%s'\n", dest->data + pos); - /* fall through */ + goto again; } #endif + o_addQchr(dest, ch); + if (ch == '=' + && (dest->o_assignment == MAYBE_ASSIGNMENT + || dest->o_assignment == WORD_IS_KEYWORD) + && is_assignment(dest->data) + ) { + dest->o_assignment = DEFINITELY_ASSIGNMENT; + } goto again; } -- cgit v1.2.3