gsocket: Set SO_NOSIGPIPE on sockets on Darwin
authorDan Winship <danw@gnome.org>
Thu, 1 May 2014 13:59:05 +0000 (09:59 -0400)
committerDan Winship <danw@gnome.org>
Mon, 21 Jul 2014 15:31:27 +0000 (11:31 -0400)
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

gio/gsocket.c

index dd0d6eb..4d863ce 100644 (file)
@@ -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