From e5d98f4c74b5e9f0125a07810ad79e3a66914d33 Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Fri, 22 Dec 2023 08:47:36 -0500 Subject: [PATCH] Avoid a spurious test failure with shells that ignore write errors. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In a surprisingly large number of cases, the ‘printf’ shell utility doesn’t report errors caused by writing to stdout. This can cause a spurious test failure on systems that have this bug in ‘printf’ and also have /dev/full. Detect such systems and skip that subtest. Problem reported by Alan Coopersmith. * tests/torture.at (AC_CONFIG_FILES, HEADERS, LINKS and COMMANDS): If /bin/sh’s printf doesn’t report an error on writing to /dev/full, skip the subtests that write to /dev/full. --- tests/torture.at | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/torture.at b/tests/torture.at index 288a5a55..d98b92c0 100644 --- a/tests/torture.at +++ b/tests/torture.at @@ -291,7 +291,21 @@ AT_CHECK_CONFIG_CREATION(command) # Create a link AT_CHECK_CONFIG_CREATION(link) -# Now check for write errors +# Now check for write errors. +# Depending on the shell, 'printf' might or might not report write +# errors on stdout. Check /bin/sh regardless of $SHELL, because +# config.status always uses /bin/sh. +# Note: another way to force a write error is with ulimit -f, but +# depending on the OS it might not be possible to set that limit +# lower than one disk block, so we'd have to make the tests below +# produce much more output. +test_write_errors=false +if test -w /dev/full && test -c /dev/full; then + if /bin/sh -c 'printf "write errors detected?\\n"' > /dev/full 2> /dev/null + then : + else test_write_errors=: + fi +fi # Create a file AT_CHECK_CONFIG_CREATION_NOWRITE(file) @@ -301,7 +315,7 @@ AT_CHECK([echo from-stdin | ./config.status --file=file:-], AT_CHECK([grep from-stdin file], [], [from-stdin ]) # Force write error creating a file on stdout -if test -w /dev/full && test -c /dev/full; then +if $test_write_errors; then AT_CHECK([./config.status --file=-:input /dev/full || exit 1], [1], [ignore], [ignore]) fi @@ -320,7 +334,7 @@ AT_CHECK([./config.status --header=-:input /dev/full || exit 1], [1], [ignore], [ignore]) fi -- 2.47.2