[BUILTIN] Allow return in loop conditional to set exit status

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



commit f14b4626eb5c1c2fda137e7d1520c5f1cb7e85c4
Author: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Date:   Mon Oct 6 21:22:43 2014 +0800

    [BUILTIN] Allow return in loop conditional to set exit status
    
    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=332954
    
    When return is used in a loop conditional the exit status will
    be lost because we always set the exit status at the end of the
    loop to that of the last command executed in the body.
    
    This is counterintuitive and contrary to what most other shells do.
    
    This patch fixes this by always preserving the exit status of
    return when it is used in a loop conditional.
    
    The patch was originally written by Gerrit Pape <pape@xxxxxxxxxxx>.
    
    Reported-by: Stephane Chazelas <stephane_chazelas@xxxxxxxx>
    Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>

diff --git a/ChangeLog b/ChangeLog
index 1d88e13..297b81a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@
 	* Exit without arguments in a trap should use status outside traps.
 	* Do not allow break to break across function calls.
 	* Move common skipcount logic into skiploop.
+	* Allow return in loop conditional to set exit status.
 
 2014-10-03  Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
 
diff --git a/src/eval.c b/src/eval.c
index daccf3d..7b341f3 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -387,8 +387,9 @@ evalloop(union node *n, int flags)
 		status = exitstatus;
 		skip = skiploop();
 	} while (!(skip & ~SKIPCONT));
+	if (skip != SKIPFUNC)
+		exitstatus = status;
 	loopnest--;
-	exitstatus = status;
 }
 

Cheers,
-- 
Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux