← Commit list

97c3b5e3f

Denys Vlasenko
Denys Vlasenko
2021-06-19
SUCCESS Duration: 155s

Subject

hush: fix bkslash+newline handling and number validation in ${NN} and ${#NN}

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash_test/ash-parsing/bkslash_newline4.right+4 -0
@@ -0,0 +1,4 @@
+1:1
+22:22
+3:3
+Ok:0
shell/ash_test/ash-parsing/bkslash_newline4.tests+14 -0
@@ -0,0 +1,14 @@
+set -- 1 22 333
+echo 1:$\
+1
+echo 22:$\
+{\
+2\
+}
+echo 3:$\
+{\
+#\
+3\
+}
+echo Ok:$\
+?
shell/hush.c+27 -1
@@ -4998,6 +4998,32 @@ static int parse_dollar(o_string *as_string,
* which check invalid constructs like ${%}.
* Oh well... let's check that the var name part is fine... */
+ if (isdigit(len_single_ch)
+ || (len_single_ch == '#' && isdigit(i_peek_and_eat_bkslash_nl(input)))
+ ) {
+ /* Execution engine uses plain xatoi_positive()
+ * to interpret ${NNN} and {#NNN},
+ * check syntax here in the parser.
+ * (bash does not support expressions in ${#NN},
+ * e.g. ${#$var} and {#1:+WORD} are not supported).
+ */
+ unsigned cnt = 9; /* max 9 digits for ${NN} and 8 for {#NN} */
+ while (1) {
+ o_addchr(dest, ch);
+ debug_printf_parse(": '%c'\n", ch);
+ ch = i_getch_and_eat_bkslash_nl(input);
+ nommu_addchr(as_string, ch);
+ if (ch == '}')
+ break;
+ if (--cnt == 0)
+ goto bad_dollar_syntax;
+ if (len_single_ch != '#' && strchr(VAR_SUBST_OPS, ch))
+ /* ${NN<op>...} is valid */
+ goto eat_until_closing;
+ if (!isdigit(ch))
+ goto bad_dollar_syntax;
+ }
+ } else
while (1) {
unsigned pos;
@@ -5008,7 +5034,6 @@ static int parse_dollar(o_string *as_string,
nommu_addchr(as_string, ch);
if (ch == '}')
break;
-
if (!isalnum(ch) && ch != '_') {
unsigned end_ch;
unsigned char last_ch;
@@ -5027,6 +5052,7 @@ static int parse_dollar(o_string *as_string,
* special var name, e.g. ${#!}.
*/
}
+ eat_until_closing:
/* Eat everything until closing '}' (or ':') */
end_ch = '}';
if (BASH_SUBSTR
shell/hush_test/hush-parsing/bkslash_newline4.right+4 -0
@@ -0,0 +1,4 @@
+1:1
+22:22
+3:3
+Ok:0
shell/hush_test/hush-parsing/bkslash_newline4.tests+14 -0
@@ -0,0 +1,14 @@
+set -- 1 22 333
+echo 1:$\
+1
+echo 22:$\
+{\
+2\
+}
+echo 3:$\
+{\
+#\
+3\
+}
+echo Ok:$\
+?
shell/hush_test/hush-vars/var6.right+1 -1
@@ -1,2 +1,2 @@
-hush: invalid number '1q'
+hush: syntax error: unterminated ${name}
hush: syntax error: unterminated ${name}