mirror of
https://github.com/curl/curl.git
synced 2026-04-15 01:11:40 +03:00
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:
parent
ef3101d181
commit
2a6ae3684e
3 changed files with 35 additions and 9 deletions
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue