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
This commit is contained in:
Stefan Eissing 2026-01-22 11:46:46 +01:00 committed by Daniel Stenberg
parent ef3101d181
commit 2a6ae3684e
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
3 changed files with 35 additions and 9 deletions

View 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 */

View 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);

View 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;
}