libfetch: Avoid SIGPIPE on network connections
authorJohn Marino <draco@marino.st>
Fri, 2 Nov 2012 00:26:34 +0000 (01:26 +0100)
committerJohn Marino <draco@marino.st>
Fri, 2 Nov 2012 00:31:45 +0000 (01:31 +0100)
To avoid unexpected process termination from SIGPIPE when writing to a
closed network connection, enable SO_NOSIGPIPE on all network connections.

The POSIX standard MSG_NOSIGNAL is not used since it requires modifying all
send calls to add this flag. This is particularly nasty for SSL connections.

Taken-from: FreeBSD SVN 236193 (28 May 2012)

lib/libfetch/common.c

index 1f5c8c6..3d0a151 100644 (file)
@@ -208,11 +208,13 @@ conn_t *
 fetch_reopen(int sd)
 {
        conn_t *conn;
+       int opt = 1;
 
        /* allocate and fill connection structure */
        if ((conn = calloc(1, sizeof(*conn))) == NULL)
                return (NULL);
         fcntl(sd, F_SETFD, FD_CLOEXEC);
+        setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof opt);
        conn->sd = sd;
        ++conn->ref;
        return (conn);