Package: dash
Version: 0.5.11+git20200708+dd9ef66-5
Version: 0.5.11+git20200708+dd9ef66-8
Severity: important
Tags: upstream
Dear Maintainer,
On current git (057cd650a4edd5856213d431a974ff35c6594489), bullseye,
and sid the following holds:
-- >8 --
$ ./src/dash -ec 'while :; do :; done < /ENOENT; echo uhoh'
./src/dash: 1: cannot open /ENOENT: No such file
uhoh
$ ./src/dash -ec 'for _ in :; do :; done < /ENOENT; echo uhoh'
./src/dash: 1: cannot open /ENOENT: No such file
uhoh
$ ./src/dash -ec 'if :; then :; fi < /ENOENT; echo uhoh'
./src/dash: 1: cannot open /ENOENT: No such file
uhoh
-- >8 --
The correct output, as demonstrated by bash, is:
-- >8 --
$ bash -ec 'while :; do :; done < /ENOENT; echo uhoh'
bash: line 1: /ENOENT: No such file or directory
$ bash -ec 'for _ in :; do :; done < /ENOENT; echo uhoh'
bash: line 1: /ENOENT: No such file or directory
$ bash -ec 'if :; then :; fi < /ENOENT; echo uhoh'
bash: line 1: /ENOENT: No such file or directory
-- >8 --
This is a POSIX violation, and quite a grave one at that:
set -e is oft[1] used to guard against precisely this type of error!
The same happens if set -e is executed.
All quotes POSIX.1, Issue 7, TC2:
sh, OPTIONS:
> The -a, -b, -C, -e, -f, -m, -n, -o option, -u, -v, and -x options
> are described as part of the set utility in Special Built-In
> Utilities.
set, DESCRIPTION, -e:
> When this option is on, when any command fails (for any of the
> reasons listed in Consequences of Shell Errors or by returning an
> exit status greater than zero), the shell immediately shall exit, as
> if by executing the exit special built-in utility with no arguments,
> with the following exceptions:
>
> 1. The failure of any individual command in a multi-command pipeline
>shall not cause the shell to exit. Only the failure of the
>pipeline itself shall be considered.
> 2. The -e setting shall be ignored when executing the compound list
>following the while, until, if, or elif reserved word, a pipeline
>beginning with the ! reserved word, or any command of an AND-OR
>list other than the last.
> 3. If the exit status of a compound command other than a subshell
>command was the result of a failure while -e was being ignored,
>then -e shall not apply to this command.
XCU, 2.9.4: Shell Command Language, Shell Commands, Compound Commands:
The while Loop:
> The format of the while loop is as follows:
>
> while compound-list-1
> do
> compound-list-2
> done
(until is equivalent).
The if Conditional Construct:
> The format for the if construct is as follows:
>
> if compound-list
> then
> compound-list
> [elif compound-list
> then
> compound-list] ...
> [else
> compound-list]
> fi
It follows, therefore, that
* Exception 1. does not apply as there is no pipeline
* Exception 2. does not apply, as the redirection does /not/ follow
"while" or "if" directly and is /not/ part of the conditional
compound-list
* in the "for" case, there is no such provision, so this is likely not
a confusion w.r.t. the conditional compound-lists
* Exception 3. does not apply as -e was not being ignored while the
compound commands were being executed (indeed, the compound commands
do not run at all, as evidenced by the program terminating)
Best,
наб
[1]: https://salsa.debian.org/glibc-team/glibc/-/merge_requests/6#note_329899
-- System Information:
Debian Release: 11.4
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500,
'stable-debug'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 5.10.0-16-amd64 (SMP w/24 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_FIRMWARE_WORKAROUND,
TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8),
LANGUAGE=en_GB:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages dash depends on:
ii debconf [debconf-2.0] 1.5.77
ii debianutils4.11.2
ii dpkg 1.20.11
ii libc6 2.31-13+deb11u3
dash recommends no packages.
dash suggests no packages.
-- debconf information:
* dash/sh: true
signature.asc
Description: PGP signature