From: Stefan Eissing Date: Thu, 22 Jan 2026 10:46:46 +0000 (+0100) Subject: socketpair: set SO_NOSIGPIPE where possible X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a6ae3684e220986c96bd62f0a05e9f1e6eb6a82;p=thirdparty%2Fcurl.git socketpair: set SO_NOSIGPIPE where possible Set SO_NOSIGPIPE on socketpair/inet-simulated socketpair implementations. eventfd and pipe() do not need/want it. Closes #20397 --- diff --git a/lib/cf-socket.c b/lib/cf-socket.c index a27df7c452..c36a730538 100644 --- a/lib/cf-socket.c +++ b/lib/cf-socket.c @@ -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 */ diff --git a/lib/cf-socket.h b/lib/cf-socket.h index e6d05962a9..298ced9269 100644 --- a/lib/cf-socket.h +++ b/lib/cf-socket.h @@ -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); diff --git a/lib/socketpair.c b/lib/socketpair.c index cefbe85238..7fd7e30bba 100644 --- a/lib/socketpair.c +++ b/lib/socketpair.c @@ -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; }