From: Pádraig Brady Date: Sat, 25 Apr 2026 15:16:49 +0000 (+0100) Subject: tests: all: ensure closed stdout is handled appropriately X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=85efb0f63c031e92096ba845da1a014155b755a0;p=thirdparty%2Fcoreutils.git tests: all: ensure closed stdout is handled appropriately * tests/misc/io-errors.sh: Add a check to ensure we diagose writing to closed stdout. Also ensure we exit with failure in other cases. * tests/misc/write-errors.sh: Likewise. --- diff --git a/tests/misc/io-errors.sh b/tests/misc/io-errors.sh index 75f50050f8..8b1fcef8fe 100755 --- a/tests/misc/io-errors.sh +++ b/tests/misc/io-errors.sh @@ -82,24 +82,31 @@ while read writer; do # but that's not guaranteed in the generic close_stream() handling. # For e.g. with _IOLBF etc, stdio will discard pending data at each line, # thus only giving a generic error upon ferror() in close_stream(). - error_re="$ENOSPC" + ere="$ENOSPC|$EBADF" # musl writes the first line immediately when it should be fully buffered. # As a result, when we print a single line there is no bytes buffered when # we close the stream and errno is not set. See: # . case $host_os in - *-musl*) error_re="$error_re|" ;; + *-musl*) ere="$ere|" ;; esac printf '%s' "$writer" | grep 'generic' >/dev/null && - { error_re="write error|$error_re"; } + { ere="write error|$ere"; } rm -f full.err || framework_failure_ timeout 10 env --default-signal=PIPE $SHELL -c \ "(env $writer 2>full.err >/dev/full)" - { test $? = 124 || ! grep -E "$error_re" full.err >/dev/null; } && - { fail=1; cat full.err; echo "$writer: failed to exit" >&2; } + { test $? = 124 || test $? = 0 || ! grep -E "$ere" full.err >/dev/null; } && + { fail=1; cat full.err; echo "$writer: failed to diagose ENOSPC" >&2; } + + # Check closed stdout handling + rm -f closed.err || framework_failure_ + timeout 10 env --default-signal=PIPE $SHELL -c \ + "(env $writer 2>closed.err >&-)" + { test $? = 124 || test $? = 0 || ! grep -E "$ere" closed.err >/dev/null; } && + { fail=1; cat closed.err; echo "$writer: failed to diagnose EBADF" >&2; } # https://github.com/ksh93/ksh/issues/741 $SHELL -c 'test -n "$KSH_VERSION"' && continue @@ -110,6 +117,7 @@ while read writer; do "(env $writer 2>pipe.err | :)" { test $? = 0 && compare /dev/null pipe.err; } || { fail=1; cat pipe.err; echo "$writer: failed writing to closed pipe" >&2; } + done < built_writers Exit $fail diff --git a/tests/misc/write-errors.sh b/tests/misc/write-errors.sh index f1a9000a6f..6d13f3c0f0 100755 --- a/tests/misc/write-errors.sh +++ b/tests/misc/write-errors.sh @@ -86,8 +86,15 @@ while read writer; do rm -f full.err || framework_failure_ timeout 10 env --default-signal=PIPE $SHELL -c \ "($ulimit && $writer 2>full.err >/dev/full)" - { test $? = 124 || ! grep "$ENOSPC" full.err >/dev/null; } && - { fail=1; cat full.err; echo "$writer: failed to exit" >&2; } + { test $? = 124 || test $? = 0 || ! grep "$ENOSPC" full.err >/dev/null; } && + { fail=1; cat full.err; echo "$writer: failed to diagnose ENOSPC" >&2; } + + # Check closed stdout handling + rm -f closed.err || framework_failure_ + timeout 10 env --default-signal=PIPE $SHELL -c \ + "($ulimit && $writer 2>closed.err >&-)" + { test $? = 124 || test $? = 0 || ! grep -E "$EBADF" closed.err >/dev/null; }\ + && { fail=1; cat closed.err; echo "$writer: failed to diagnose EBADF" >&2; } # https://github.com/ksh93/ksh/issues/741 $SHELL -c 'test -n "$KSH_VERSION"' && continue @@ -98,6 +105,7 @@ while read writer; do "($ulimit && $writer 2>pipe.err | :)" { test $? = 0 && compare /dev/null pipe.err; } || { fail=1; cat pipe.err; echo "$writer: failed to write to closed pipe" >&2; } + done < built_writers Exit $fail