diff options
Diffstat (limited to 'tests/misc/write-errors.sh')
| -rwxr-xr-x | tests/misc/write-errors.sh | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/tests/misc/write-errors.sh b/tests/misc/write-errors.sh index 47220584a..6d13f3c0f 100755 --- a/tests/misc/write-errors.sh +++ b/tests/misc/write-errors.sh @@ -1,7 +1,7 @@ #!/bin/sh # Make sure all of these programs promptly diagnose write errors. -# Copyright (C) 2023-2025 Free Software Foundation, Inc. +# Copyright (C) 2023-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 @@ -24,16 +24,24 @@ if ! test -w /dev/full || ! test -c /dev/full; then skip_ '/dev/full is required' fi -# Writers that may output data indefinitely -# First word in command line is checked against built programs +dev_null_hash=$(cksum -a sha3 -l 256 /dev/null) || framework_failure_ + +# Writers that may output data indefinitely. +# First word in command line is checked against built programs. +# Escapes must be double escaped. printf '%s' "\ cat /dev/zero +cksum --version; yes '${dev_null_hash}' | cksum --check comm -z /dev/zero /dev/zero cut -z -c1- /dev/zero cut -z -f1- /dev/zero +cut -f1 /dev/zero +cut -b1- /dev/zero +cut -c1- /dev/zero date +%${OFF64_T_MAX}c date --version; yes 0 | date -f- dd if=/dev/zero +du --version; yes /dev/null | tr '\\\\n' '\\\\0' | du -l --files0-from=- expand /dev/zero factor --version; yes 1 | factor fmt /dev/zero @@ -41,7 +49,7 @@ fmt --version; yes | fmt fold /dev/zero fold -b /dev/zero fold -c /dev/zero -fold --version; yes | tr -d '\\n' | fold +fold --version; yes | fold head -z -n-1 /dev/zero join -a 1 -z /dev/zero /dev/null nl --version; yes | nl @@ -51,11 +59,13 @@ paste /dev/zero pr /dev/zero pr --version; yes 1 | pr seq inf +shuf -i 0-1 -r tail -n+1 -z /dev/zero tee < /dev/zero tr . . < /dev/zero unexpand /dev/zero uniq -z -D /dev/zero +wc --version; yes /dev/null | tr '\\\\n' '\\\\0' | wc --files0-from=- yes " | sort -k 1b,1 > all_writers || framework_failure_ @@ -68,7 +78,7 @@ join all_writers built_programs > built_writers || framework_failure_ while read writer; do # Enforce mem usage limits if possible cmd=$(printf '%s\n' "$writer" | cut -d ' ' -f1) || framework_failure_ - base_mem=$(get_min_ulimit_v_ $cmd --version) \ + base_mem=$(get_min_ulimit_v_ $SHELL -c "$cmd --version") \ && ulimit="ulimit -v $(($base_mem+12000))" \ || skip_ 'unable to determine ulimit -v' @@ -76,8 +86,18 @@ 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 'space' 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 # Check closed pipe handling rm -f pipe.err || framework_failure_ @@ -85,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 |
