From 40dc3e0d3bee6ff70fb68d9ba7f0a2ee9da96f68 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Wed, 29 Feb 2012 19:40:18 -0500
Subject: [PATCH] When constructing a pipe to child stdin on Posix, ignore
 SIGPIPE. We can't count on every child process reading everything we try to
 write to it. And if the child terminates with WritePipe data still pending,
 unless we explicitly suppress it, Posix will hit us with SIGPIPE. That would
 terminate the calling process, boom. "Ignoring" it means APR gets the correct
 errno, passes it back to us, we log it, etc.

---
 indra/llcommon/llprocess.cpp | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp
index edfdebfe872..8ccd39152b4 100644
--- a/indra/llcommon/llprocess.cpp
+++ b/indra/llcommon/llprocess.cpp
@@ -145,6 +145,15 @@ class WritePipeImpl: public LLProcess::WritePipe
 		mConnection = LLEventPumps::instance().obtain("mainloop")
 			.listen(LLEventPump::inventName("WritePipe"),
 					boost::bind(&WritePipeImpl::tick, this, _1));
+
+#if ! LL_WINDOWS
+		// We can't count on every child process reading everything we try to
+		// write to it. And if the child terminates with WritePipe data still
+		// pending, unless we explicitly suppress it, Posix will hit us with
+		// SIGPIPE. That would terminate the viewer, boom. "Ignoring" it means
+		// APR gets the correct errno, passes it back to us, we log it, etc.
+		signal(SIGPIPE, SIG_IGN);
+#endif
 	}
 
 	virtual std::ostream& get_ostream() { return mStream; }
-- 
GitLab