]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
socketpair: set SO_NOSIGPIPE where possible
authorStefan Eissing <stefan@eissing.org>
Thu, 22 Jan 2026 10:46:46 +0000 (11:46 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 22 Jan 2026 16:18:16 +0000 (17:18 +0100)
Set SO_NOSIGPIPE on socketpair/inet-simulated socketpair
implementations. eventfd and pipe() do not need/want it.

Closes #20397

lib/cf-socket.c
lib/cf-socket.h
lib/socketpair.c

index a27df7c4521a471fc2833f8b9b5322aea3b580bc..c36a73053828a0ca5d05abf35e0cfdd882e3b754 100644 (file)
@@ -294,6 +294,15 @@ static CURLcode sock_assign_addr(struct Curl_sockaddr_ex *dest,
   return CURLE_OK;
 }
 
+#ifdef USE_SO_NOSIGPIPE
+int Curl_sock_nosigpipe(curl_socket_t sockfd)
+{
+  int onoff = 1;
+  return setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE,
+                    (void *)&onoff, sizeof(onoff));
+}
+#endif /* USE_SO_NOSIGPIPE */
+
 static CURLcode socket_open(struct Curl_easy *data,
                             struct Curl_sockaddr_ex *addr,
                             curl_socket_t *sockfd)
@@ -333,15 +342,12 @@ static CURLcode socket_open(struct Curl_easy *data,
   }
 
 #ifdef USE_SO_NOSIGPIPE
-  {
-    int onoff = 1;
-    if(setsockopt(*sockfd, SOL_SOCKET, SO_NOSIGPIPE,
-                  (void *)&onoff, sizeof(onoff)) < 0) {
-      failf(data, "setsockopt enable SO_NOSIGPIPE: %s",
-            curlx_strerror(SOCKERRNO, errbuf, sizeof(errbuf)));
-      *sockfd = CURL_SOCKET_BAD;
-      return CURLE_COULDNT_CONNECT;
-    }
+  if(Curl_sock_nosigpipe(*sockfd) < 0) {
+    failf(data, "setsockopt enable SO_NOSIGPIPE: %s",
+          curlx_strerror(SOCKERRNO, errbuf, sizeof(errbuf)));
+    sclose(*sockfd);
+    *sockfd = CURL_SOCKET_BAD;
+    return CURLE_COULDNT_CONNECT;
   }
 #endif /* USE_SO_NOSIGPIPE */
 
index e6d05962a9b355e8b9a4f4b937a8f7868e8358a2..298ced926996b3b35f54a084a73c7352cd3f9c52 100644 (file)
@@ -73,6 +73,11 @@ CURLcode Curl_socket_open(struct Curl_easy *data,
                           uint8_t transport,
                           curl_socket_t *sockfd);
 
+#ifdef USE_SO_NOSIGPIPE
+/* Set SO_NOSIGPIPE on socket, return < 0 on error. */
+int Curl_sock_nosigpipe(curl_socket_t sockfd);
+#endif
+
 int Curl_socket_close(struct Curl_easy *data, struct connectdata *conn,
                       curl_socket_t sock);
 
index cefbe8523866e23037c7c0d44ce1815a932707c7..7fd7e30bbab8271c2ff28ebd5d217375371c0d0d 100644 (file)
@@ -109,10 +109,20 @@ static int wakeup_socketpair(curl_socket_t socks[2], bool nonblocking)
        curlx_nonblock(socks[1], TRUE) < 0) {
       sclose(socks[0]);
       sclose(socks[1]);
+      socks[0] = socks[1] = CURL_SOCKET_BAD;
       return -1;
     }
   }
 #endif
+#ifdef USE_SO_NOSIGPIPE
+  if(Curl_sock_nosigpipe(socks[1]) < 0) {
+    sclose(socks[0]);
+    sclose(socks[1]);
+    socks[0] = socks[1] = CURL_SOCKET_BAD;
+    return -1;
+  }
+#endif /* USE_SO_NOSIGPIPE */
+
   return 0;
 }
 
@@ -253,6 +263,10 @@ static int wakeup_inet(curl_socket_t socks[2], bool nonblocking)
     if(curlx_nonblock(socks[0], TRUE) < 0 ||
        curlx_nonblock(socks[1], TRUE) < 0)
       goto error;
+#ifdef USE_SO_NOSIGPIPE
+  if(Curl_sock_nosigpipe(socks[1]) < 0)
+    goto error;
+#endif
   sclose(listener);
   return 0;
 
@@ -260,6 +274,7 @@ error:
   sclose(listener);
   sclose(socks[0]);
   sclose(socks[1]);
+  socks[0] = socks[1] = CURL_SOCKET_BAD;
   return -1;
 }