From: Dan Winship Date: Thu, 1 May 2014 13:59:05 +0000 (-0400) Subject: gsocket: Set SO_NOSIGPIPE on sockets on Darwin X-Git-Tag: 2.41.3~45 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=634b69219979c084837c59874e5b2aec01a1d3e4;p=platform%2Fupstream%2Fglib.git 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. https://bugzilla.gnome.org/show_bug.cgi?id=728730 --- diff --git a/gio/gsocket.c b/gio/gsocket.c index dd0d6eb..4d863ce 100644 --- a/gio/gsocket.c +++ b/gio/gsocket.c @@ -579,6 +579,11 @@ g_socket_constructed (GObject *object) g_warning ("Error setting socket status flags: %s", socket_strerror (errsv)); } #endif + +#ifdef SO_NOSIGPIPE + /* See note about SIGPIPE below. */ + g_socket_set_option (socket, SOL_SOCKET, SO_NOSIGPIPE, TRUE, NULL); +#endif } } @@ -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); #endif @@ -2677,10 +2687,7 @@ g_socket_receive_from (GSocket *socket, error); } -/* 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. */ #ifdef MSG_NOSIGNAL #define G_SOCKET_DEFAULT_SEND_FLAGS MSG_NOSIGNAL #else