I wrote this based on the table based approach in
tests/misc/{read,write}-errors.sh. Looking good, or did I miss anything?I considered adding a timeout, but the only way these would run forever is if stdin is re-opened to be /dev/zero or something like that. -- 8< -- * tests/misc/close-stdin.sh: New file. * tests/local.mk (all_tests): Add the new test. --- tests/local.mk | 1 + tests/misc/close-stdin.sh | 86 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100755 tests/misc/close-stdin.sh diff --git a/tests/local.mk b/tests/local.mk index 6a70e4dcf..d72361e40 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -316,6 +316,7 @@ all_tests = \ tests/basenc/basenc.pl \ tests/basenc/bounded-memory.sh \ tests/basenc/large-input.sh \ + tests/misc/close-stdin.sh \ tests/misc/close-stdout.sh \ tests/chroot/chroot-fail.sh \ tests/cksum/cksum.sh \ diff --git a/tests/misc/close-stdin.sh b/tests/misc/close-stdin.sh new file mode 100755 index 000000000..1f5ba7410 --- /dev/null +++ b/tests/misc/close-stdin.sh @@ -0,0 +1,86 @@ +#!/bin/sh +# Ensure that several programs work fine, even with stdin initially closed. + +# Copyright (C) 2026 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +getlimits_ + +printf '%s' "\ +basenc --base16 - +basenc --base2lsbf - +basenc --base2msbf - +basenc --base32 - +basenc --base32hex - +basenc --base58 - +basenc --base64 - +basenc --base64url - +cat - +cksum -a blake2b - +cksum -a bsd - +cksum -a crc - +cksum -a crc32b - +cksum -a md5 - +cksum -a sha1 - +cksum -a sha2 -l 256 - +cksum -a sha3 -l 256 - +cksum -a sm3 - +cksum -a sysv - +cksum -c - +comm - - +cut -f1 - +date --file=- +dd +dircolors - +du --files0-from=- +expand - +factor +fmt - +fold - +head -n1 - +join - /dev/null +nl - +numfmt +od - +paste - +pr - +ptx - +shuf - +split - +stty +tac - +tail - +tee - +tr a a +tsort +unexpand - +uniq - +wc - +" | +sort -k 1b,1 > all_readers || framework_failure_ + +printf '%s\n' $built_programs | +sort -k 1b,1 > built_programs || framework_failure_ + +join all_readers built_programs > built_writers || framework_failure_ + +while read reader; do + $reader 2>err <&- && fail=1 + ! grep -E "$EBADF" err >/dev/null \ + && { fail=1; cat err; echo "$reader: failed to diagnose EBADF" >&2; } +done < built_writers + +Exit $fail -- 2.54.0
