From f415e21a7dce1d4f4b760fddfaba85c551681e11 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko
Date: Tue, 7 Sep 2021 01:54:23 +0200
Subject: ash: eval: Do not cache value of eflag in evaltree
Upsteam commit:
Date: Mon, 17 May 2021 15:19:23 +0800
eval: Do not cache value of eflag in evaltree
Patrick BrĂ¼nn
wrote:
> Since we are migrating to Debian bullseye, we discovered a new behavior
> with our scripts, which look like this:
>>cleanup() {
>> set +e
>> rmdir ""
>>}
>>set -eu
>>trap 'cleanup' EXIT INT TERM
>>echo 'Hello world!'
>
> With old dash v0.5.10.2 this script would return 0 as we expected it.
> But since commit 62cf6955f8abe875752d7163f6f3adbc7e49ebae it returns
> the last exit code of our cleanup function.
...
Thanks for the report. This is actually a fairly old bug with
set -e that's just been exposed by the exit status change. What's
really happening is that cleanup itself is triggering a set -e
exit incorrectly because evaltree cached the value of eflag prior
to the function call.
Signed-off-by: Denys Vlasenko
---
shell/ash_test/ash-misc/exitcode_trap7.tests | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100755 shell/ash_test/ash-misc/exitcode_trap7.tests
(limited to 'shell/ash_test/ash-misc/exitcode_trap7.tests')
diff --git a/shell/ash_test/ash-misc/exitcode_trap7.tests b/shell/ash_test/ash-misc/exitcode_trap7.tests
new file mode 100755
index 0000000..9772a7b
--- /dev/null
+++ b/shell/ash_test/ash-misc/exitcode_trap7.tests
@@ -0,0 +1,7 @@
+$THIS_SH -c '
+cleanup() { set +e; false; }
+set -eu
+trap cleanup EXIT
+echo Start
+'
+echo Ok:$?
--
cgit v1.1