From d768a7492a850e8d1ccb00f2cc8eef0bd238b7ab Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Tue, 9 Oct 2018 10:05:05 +0100 Subject: 43653: explicit exit from EXIT trap overrides exit status --- Src/builtin.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'Src/builtin.c') diff --git a/Src/builtin.c b/Src/builtin.c index c5b319b68..b81acdb53 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -5709,7 +5709,13 @@ int shell_exiting; mod_export void zexit(int val, int from_where) { - /* Don't do anything recursively: see below */ + static int exit_val; + /* + * Don't do anything recursively: see below. + * Do, however, update exit status --- there's no nesting, + * a later value always overrides an earlier. + */ + exit_val = val; if (shell_exiting == -1) return; @@ -5757,7 +5763,7 @@ zexit(int val, int from_where) #endif } } - lastval = val; + lastval = exit_val; /* * Now we are committed to exiting any previous state * is irrelevant. Ensure trap can run. @@ -5771,9 +5777,9 @@ zexit(int val, int from_where) release_pgrp(); } if (mypid != getpid()) - _exit(val); + _exit(exit_val); else - exit(val); + exit(exit_val); } /* . (dot), source */ -- cgit 1.4.1