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 <P.Bruenn@beckhoff.com> 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 <vda.linux@googlemail.com>
			
			
This commit is contained in:
		
							
								
								
									
										2
									
								
								shell/ash_test/ash-misc/exitcode_trap7.right
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								shell/ash_test/ash-misc/exitcode_trap7.right
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
Start
 | 
			
		||||
Ok:0
 | 
			
		||||
							
								
								
									
										7
									
								
								shell/ash_test/ash-misc/exitcode_trap7.tests
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										7
									
								
								shell/ash_test/ash-misc/exitcode_trap7.tests
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
$THIS_SH -c '
 | 
			
		||||
cleanup() { set +e; false; }
 | 
			
		||||
set -eu
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
echo Start
 | 
			
		||||
'
 | 
			
		||||
echo Ok:$?
 | 
			
		||||
		Reference in New Issue
	
	Block a user