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