Package: bash
Version: 3.0-10
Severity: normal
I'd consider raising the severity, given the amount of pain this has
caused me, and because it's a common case, and because it mostly
defeats the purpose of trap - but there's an easy workaround *and* the
bug has been around for years. (As such, please forward it upstream;
I'm sending it via debian primarily for the tracking, and to give
people a chance to think about other packages using trap in config
scripts.)
trap, with a *single*, *non-builtin* command, and a signal_spec of 0,
trashes the exit status.
The case where I found this was a build script using it for a
"try/finally" cleanup, namely
/bin/sh -c '... create file ... trap "rm -f file" 0; configure && build &&
install'
the idea being that if any of configure/build/install fail, the shell
line fails, but the rm occurs. What was noticed originally was that
the build would continue.
It turns out that there's a workaround: make sure that the trap
command is more than one statement. Adding "; true" after the rm is
sufficient, as is wrapping the command in ().
The reduction of the broken case to something easy to try:
$ /bin/bash -c 'trap "/bin/echo" 0 && false'; echo STATUS: $?
STATUS: 0
Examples of other cases which are very similar, but which pass the
false status through correctly:
Two commands:
$ /bin/bash -c 'trap "/bin/echo;/bin/echo" 0 && false'; echo STATUS: $?
STATUS: 1
A builtin, instead of a command:
$ /bin/bash -c 'trap "echo" 0 && false'; echo STATUS: $?
STATUS: 1
Grouping the command with ():
$ /bin/bash -c 'trap "(/bin/echo)" 0 && false'; echo STATUS: $?
STATUS: 1
Appending a builtin:
$ /bin/bash -c 'trap "/bin/echo; true" 0 && false'; echo STATUS: $?
STATUS: 1
The above bug is consistent on
GNU bash, version 2.05.0(1)-release (sparc-sun-solaris2.9) [Solaris 9]
GNU bash, version 3.00.16(1)-release (i386-pc-linux-gnu) [debian sarge]
GNU bash, version 2.05a.0(1)-release (i386-pc-linux-gnu) [debian woody]
Note that /bin/sh on Solaris 9 reports "STATUS: 255" for all of these;
/usr/xpg4/bin/sh reports "STATUS: 1".
For another angle on the same bug, though perhaps not a clarifying one
(because exit is a builtin...):
$ /bin/bash -c 'trap "exit 42" 0 && exit 33'; echo STATUS: $?
STATUS: 42
$ /bin/bash -c 'trap "(exit 42)" 0 && exit 33'; echo STATUS: $?
STATUS: 33
This may, however, be a *different* bug given that some of the other
workarounds don't impact it.
Using /bin/sh instead of /bin/bash doesn't change anything (ie. posix
mode doesn't matter.)
dash/ash does not exhibit the bug either.
I note that the dpkg scripts already have a different workaround for it:
info/dpkg.preinst:18:trap 'es=$?; rm -f /var/lib/dpkg/bp.$$; exit $es' 0
A quick look at dpkg scripts installed on my system (not a
comprehensive archive scan by any means) turns up these cases where
this bug could mask a postinst failure; I haven't dug deeply enough to
tell if they actually lead to bugs or not, though.
info/w3m.postinst:18: trap "rm -f $tmp" 0 1 2 15
info/postgresql.preinst:121:trap "rm -f $TMPFILE" 0
info/tpconfig.postinst:77: trap "clean_temp_files" EXIT INT QUIT TERM
_Mark_ <[EMAIL PROTECTED]>
<[EMAIL PROTECTED]>
-- System Information:
Debian Release: 3.1
Architecture: i386 (i686)
Kernel: Linux 2.6.13.2toughbook
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Versions of packages bash depends on:
ii base-files 3.1.2 Debian base system miscellaneous f
ii libc6 2.3.5-6 GNU C Library: Shared libraries an
ii libncurses5 5.4-4 Shared libraries for terminal hand
ii passwd 1:4.0.3-31sarge5 change and administer password and
-- no debconf information
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]