diff --git a/llvm/lib/Support/Unix/Signals.inc b/llvm/lib/Support/Unix/Signals.inc --- a/llvm/lib/Support/Unix/Signals.inc +++ b/llvm/lib/Support/Unix/Signals.inc @@ -432,6 +432,10 @@ } void llvm::sys::DefaultOneShotPipeSignalHandler() { + // UNIX03 conformance requires a non-zero exit code and an error message + // to stderr when writing to a closed stdout fails. + errs() << "error: write on a pipe with no reader\n"; + // Send a special return code that drivers can check for, from sysexits.h. exit(EX_IOERR); } diff --git a/llvm/test/tools/llvm-nm/Inputs/unix03-sigpipe-exit.sh b/llvm/test/tools/llvm-nm/Inputs/unix03-sigpipe-exit.sh new file mode 100755 --- /dev/null +++ b/llvm/test/tools/llvm-nm/Inputs/unix03-sigpipe-exit.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +NM_CMD=${1:-$(which nm)} +exec 3>&1 +( + # sleep first, so that true can finish running before nm does. + # Because true finishes earlier, stdout for nm will be closed and nm will + # receive SIGPIPE signal when writing to or flushing stdout. + sleep 2 + $NM_CMD $(which $NM_CMD) + echo exitstatus $? >&3 +) | true diff --git a/llvm/test/tools/llvm-nm/unix03-sigpipe-exit.test b/llvm/test/tools/llvm-nm/unix03-sigpipe-exit.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-nm/unix03-sigpipe-exit.test @@ -0,0 +1,11 @@ +# Test that when nm tries to write to a closed stdout it will finish with +# a non-zero exit code and an error message on stderr. +# This is required for UNIX03 conformance. + +UNSUPPORTED: system-windows + +RUN: sh %S/Inputs/unix03-sigpipe-exit.sh llvm-nm > %t.stdout 2> %t.stderr +RUN: FileCheck --check-prefix=STDOUT --input-file=%t.stdout %s +RUN: FileCheck --check-prefix=STDERR --input-file=%t.stderr %s +STDOUT-NOT: exitstatus 0 +STDERR: write on a pipe with no reader