Commit 634b6921 authored by Dan Winship's avatar Dan Winship

gsocket: Set SO_NOSIGPIPE on sockets on Darwin

This is a best-effort approach to preventing SIGPIPE emissions on Darwin
and iOS, where they continue to be intercepted by the Xcode debugger
even if SIG_IGN prevents them crashing the program.

This is similar to the existing code which sets MSG_NOSIGNAL on all
send() calls. MSG_NOSIGNAL doesn't exist on Darwin though.

Based on a patch from Philip Withnall.
parent 7b34e07a
......@@ -579,6 +579,11 @@ g_socket_constructed (GObject *object)
g_warning ("Error setting socket status flags: %s", socket_strerror (errsv));
/* See note about SIGPIPE below. */
g_socket_set_option (socket, SOL_SOCKET, SO_NOSIGPIPE, TRUE, NULL);
......@@ -767,6 +772,11 @@ g_socket_class_init (GSocketClass *klass)
/* There is no portable, thread-safe way to avoid having the process
* be killed by SIGPIPE when calling send() or sendmsg(), so we are
* forced to simply ignore the signal process-wide.
* Even if we ignore it though, gdb will still stop if the app
* receives a SIGPIPE, which can be confusing and annoying. So when
* possible, we also use MSG_NOSIGNAL / SO_NOSIGPIPE elsewhere to
* prevent the signal from occurring at all.
signal (SIGPIPE, SIG_IGN);
......@@ -2677,10 +2687,7 @@ g_socket_receive_from (GSocket *socket,
/* Although we ignore SIGPIPE, gdb will still stop if the app receives
* one, which can be confusing and annoying. So if possible, we want
* to suppress the signal entirely.
/* See the comment about SIGPIPE above. */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment