← Commit list

b4cedd4c9

Denys Vlasenko
Denys Vlasenko
2025-08-18
SUCCESS Duration: 179s

Subject

hush: fix several syntax corner cases with function definitions

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-misc/func6.right+3 -0
@@ -0,0 +1,3 @@
+1
+2
+3
shell/ash_test/ash-misc/func6.tests+8 -0
@@ -0,0 +1,8 @@
+{ f() { echo $1; } }
+f 1
+
+{ f() ( echo $1; )}
+f 2
+
+{ f()(echo $1)}
+f 3
shell/ash_test/ash-misc/func7.right+1 -0
@@ -0,0 +1 @@
+Ok:0
shell/ash_test/ash-misc/func7.tests+1 -0
@@ -0,0 +1 @@
+if f() { echo Ok:$?; } then f; fi
shell/hush.c+11 -2
@@ -4469,7 +4469,12 @@ static int done_word(struct parse_context *ctx)
} else
# endif
/* Is it a place where keyword can appear? */
- if (!command->argv /* if it's the first word of command... */
+//FIXME: this is wrong, it allows invalid syntax: { echo t; } if true; then echo YES; fi
+ if ((!command->argv /* if it's the first word of command... */
+# if ENABLE_HUSH_FUNCTIONS
+ || command->cmd_type == CMD_FUNCDEF /* ^^^ or after FUNC() {} */
+# endif
+ )
&& !ctx->word.has_quoted_part /* ""WORD never matches any keywords */
&& !command->redirects /* no redirects yet... disallows: </dev/null if true; then... */
# if ENABLE_HUSH_LOOPS
@@ -6067,7 +6072,11 @@ static struct pipe *parse_stream(char **pstring,
} else
#endif
/* Are { and } special here? */
- if (ctx.command->argv /* WORD [WORD]{... - non-special */
+ if ((ctx.command->argv /* WORD [WORD]{... - non-special */
+#if ENABLE_HUSH_FUNCTIONS
+ && ctx.command->cmd_type != CMD_FUNCDEF /* ^^^ unless FUNC() {} */
+#endif
+ )
|| !IS_NULL_WORD(ctx.word) /* WORD{... ""{... - non-special */
|| (next != ';' /* }; - special */
&& next != ')' /* }) - special */
shell/hush_test/hush-misc/func6.right+3 -0
@@ -0,0 +1,3 @@
+1
+2
+3
shell/hush_test/hush-misc/func6.tests+8 -0
@@ -0,0 +1,8 @@
+{ f() { echo $1; } }
+f 1
+
+{ f() ( echo $1; )}
+f 2
+
+{ f()(echo $1)}
+f 3
shell/hush_test/hush-misc/func7.right+1 -0
@@ -0,0 +1 @@
+Ok:0
shell/hush_test/hush-misc/func7.tests+1 -0
@@ -0,0 +1 @@
+if f() { echo Ok:$?; } then f; fi