Blob Blame History Raw
commit 890f35cbcb28440c7e6c74055a77e3474c39fc3e
Author: Andy Lutomirski <luto@kernel.org>
Date:   Tue Sep 15 18:24:11 2015 -0700

    Don't complain if do_builtin_io fails due to EPIPE
    
    If stdio is dead due to EPIPE, there's no great reason to spew a stack dump.
    
    This will still write an error to stderr if stdout dies.  This might be
    undesirable, but changing that should be considered separately.

diff --git a/src/exec.cpp b/src/exec.cpp
index 39385b06a432..d7ff483bda3b 100644
--- a/src/exec.cpp
+++ b/src/exec.cpp
@@ -1161,7 +1161,7 @@ void exec_job(parser_t &parser, job_t *j)
                             const std::string outbuff = wcs2string(out);
                             const std::string errbuff = wcs2string(err);
                             bool builtin_io_done = do_builtin_io(outbuff.data(), outbuff.size(), errbuff.data(), errbuff.size());
-                            if (! builtin_io_done)
+                            if (! builtin_io_done && errno != EPIPE)
                             {
                                 show_stackframe();
                             }
diff --git a/src/postfork.cpp b/src/postfork.cpp
index 1eb958ad9f0d..29cf850ca3d6 100644
--- a/src/postfork.cpp
+++ b/src/postfork.cpp
@@ -569,12 +569,13 @@ bool do_builtin_io(const char *out, size_t outlen, const char *err, size_t errle
     bool success = true;
     if (out && outlen)
     {
-
         if (write_loop(STDOUT_FILENO, out, outlen) < 0)
         {
+            int e = errno;
             debug_safe(0, "Error while writing to stdout");
             safe_perror("write_loop");
             success = false;
+            errno = e;
         }
     }