Calling `return' after a funsub outside of a function or `.' context
doesn't behave correctly:

$ bash -c '${ :; }; (return 2); echo $?'
2

$ bash -c '${ :; }; return'
Segmentation fault
From cd67d9defa0dbb7be36c1df163db33e78cac8f27 Mon Sep 17 00:00:00 2001
From: Grisha Levit <grishale...@gmail.com>
Date: Tue, 28 Nov 2023 00:26:37 -0500
Subject: [PATCH] fix return after funsub

---
 subst.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/subst.c b/subst.c
index d235525d..aa7f2f56 100644
--- a/subst.c
+++ b/subst.c
@@ -6857,7 +6857,7 @@ static SHELL_VAR lambdafunc = { ".bash.lambda", 0, 0, 0, 0, 0, 0 };
 WORD_DESC *
 function_substitute (char *string, int quoted, int flags)
 {
-  volatile int save_return_catch_flag, function_code;
+  volatile int function_code;
   int valsub, stdout_valid, saveout, old_frozen;
   int result, pflags, tflag, was_trap;
   char *istring, *s;
@@ -6990,11 +6990,9 @@ function_substitute (char *string, int quoted, int flags)
 
   /* if we are in a position to accept return, we have to save the old values */
   function_code = 0;
-  if (save_return_catch_flag = return_catch_flag)
-    {
-      unwind_protect_int (return_catch_flag);
-      unwind_protect_jmp_buf (return_catch);
-    }
+  unwind_protect_int (return_catch_flag);
+  if (return_catch_flag)
+    unwind_protect_jmp_buf (return_catch);
 
   was_trap = running_trap;
 
-- 
2.43.0

Reply via email to