← Commit list

d8389ad76

Denys Vlasenko
Denys Vlasenko
2009-11-16
FAILED Duration: 31s

Subject

hush: fix handling of words with braces. +65 bytes

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/hush.c+21 -8
@@ -2024,6 +2024,7 @@ static int o_glob(o_string *o, int n)
}
memset(&globdata, 0, sizeof(globdata));
+//TODO: can use GLOB_BRACE | GLOB_TILDE here:
gr = glob(pattern, 0, NULL, &globdata);
debug_printf_glob("glob('%s'):%d\n", pattern, gr);
if (gr == GLOB_NOSPACE)
@@ -5384,6 +5385,8 @@ static int parse_group(o_string *dest, struct parse_context *ctx,
goto skip;
}
#endif
+
+#if 0 /* Prevented by caller */
if (command->argv /* word [word]{... */
|| dest->length /* word{... */
|| dest->o_quoted /* ""{... */
@@ -5393,6 +5396,7 @@ static int parse_group(o_string *dest, struct parse_context *ctx,
"syntax error, groups and arglists don't mix\n");
return 1;
}
+#endif
#if ENABLE_HUSH_FUNCTIONS
skip:
@@ -5962,10 +5966,24 @@ static struct pipe *parse_stream(char **pstring,
return pi;
}
nommu_addchr(&ctx.as_string, ch);
+
+ next = '\0';
+ if (ch != '\n')
+ next = i_peek(input);
+
+ is_special = "{}<>;&|()#'" /* special outside of "str" */
+ "\\$\"" IF_HUSH_TICK("`"); /* always special */
+ /* Are { and } special here? */
+ if (ctx.command->argv /* word [word]{... */
+ || dest.length /* word{... */
+ || dest.o_quoted /* ""{... */
+ || (next != ';' && next != ')' && !strchr(G.ifs, next)) /* {word */
+ ) {
+ /* They are not special, skip "{}" */
+ is_special += 2;
+ }
+ is_special = strchr(is_special, ch);
is_ifs = strchr(G.ifs, ch);
- is_special = strchr("<>;&|(){}#'" /* special outside of "str" */
- "\\$\"" IF_HUSH_TICK("`") /* always special */
- , ch);
if (!is_special && !is_ifs) { /* ordinary char */
ordinary_char:
@@ -6076,11 +6094,6 @@ static struct pipe *parse_stream(char **pstring,
if (is_ifs)
continue;
- next = '\0';
- if (ch != '\n') {
- next = i_peek(input);
- }
-
/* Catch <, > before deciding whether this word is
* an assignment. a=1 2>z b=2: b=2 is still assignment */
switch (ch) {
shell/hush_test/hush-parsing/brace1.right+7 -0
@@ -0,0 +1,7 @@
+{abc}
+{
+}
+hush: can't execute '{cmd': No such file or directory
+hush: can't execute '{': No such file or directory
+hush: can't execute '{': No such file or directory
+Done: 127
shell/hush_test/hush-parsing/brace1.tests+7 -0
@@ -0,0 +1,7 @@
+echo {abc}
+echo {
+echo }
+{cmd
+""{
+{""
+echo Done: $?