diff options
author | Daniel Stenberg <daniel@haxx.se> | 2021-06-03 12:12:13 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2021-06-03 12:12:16 +0200 |
commit | 3e70c3430a370a31eff2c1d8fea29edaca8f1127 (patch) | |
tree | 4f0ca5cfbc21194b91176e66eba53cac2476fe9e /lib/socketpair.c | |
parent | c769d1eab4de8b9f1bd84d992c63692fdc43c5be (diff) | |
download | curl-3e70c3430a370a31eff2c1d8fea29edaca8f1127.tar.gz |
Revert "socketpair: fix potential hangs"
This reverts commit c769d1eab4de8b9f1bd84d992c63692fdc43c5be.
See #7144 for details
Diffstat (limited to 'lib/socketpair.c')
-rw-r--r-- | lib/socketpair.c | 34 |
1 files changed, 9 insertions, 25 deletions
diff --git a/lib/socketpair.c b/lib/socketpair.c index 26e1dc66d..2c580ad2d 100644 --- a/lib/socketpair.c +++ b/lib/socketpair.c @@ -48,10 +48,6 @@ #endif /* !INADDR_LOOPBACK */ #endif /* !WIN32 */ -#include "nonblock.h" /* for curlx_nonblock */ -#include "timeval.h" /* needed before select.h */ -#include "select.h" /* for Curl_poll */ - /* The last 3 #include files should be in this order */ #include "curl_printf.h" #include "curl_memory.h" @@ -63,11 +59,12 @@ int Curl_socketpair(int domain, int type, int protocol, union { struct sockaddr_in inaddr; struct sockaddr addr; - } a, a2; + } a; curl_socket_t listener; curl_socklen_t addrlen = sizeof(a.inaddr); int reuse = 1; - struct pollfd pfd[1]; + char data[2][12]; + ssize_t dlen; (void)domain; (void)type; (void)protocol; @@ -88,8 +85,7 @@ int Curl_socketpair(int domain, int type, int protocol, goto error; if(bind(listener, &a.addr, sizeof(a.inaddr)) == -1) goto error; - if(getsockname(listener, &a.addr, &addrlen) == -1 || - addrlen < (int)sizeof(a.inaddr)) + if(getsockname(listener, &a.addr, &addrlen) == -1) goto error; if(listen(listener, 1) == -1) goto error; @@ -98,30 +94,18 @@ int Curl_socketpair(int domain, int type, int protocol, goto error; if(connect(socks[0], &a.addr, sizeof(a.inaddr)) == -1) goto error; - - /* use non-blocking accept to make sure we don't block forever */ - if(curlx_nonblock(listener, TRUE) < 0) - goto error; - pfd[0].fd = listener; - pfd[0].events = POLLIN; - pfd[0].revents = 0; - (void)Curl_poll(pfd, 1, 10*1000); /* 10 seconds */ socks[1] = accept(listener, NULL, NULL); if(socks[1] == CURL_SOCKET_BAD) goto error; /* verify that nothing else connected */ - addrlen = sizeof(a.inaddr); - if(getsockname(socks[0], &a.addr, &addrlen) == -1 || - addrlen < (int)sizeof(a.inaddr)) + msnprintf(data[0], sizeof(data[0]), "%p", socks); + dlen = strlen(data[0]); + if(swrite(socks[0], data[0], dlen) != dlen) goto error; - addrlen = sizeof(a2.inaddr); - if(getpeername(socks[1], &a2.addr, &addrlen) == -1 || - addrlen < (int)sizeof(a2.inaddr)) + if(sread(socks[1], data[1], sizeof(data[1])) != dlen) goto error; - if(a.inaddr.sin_family != a2.inaddr.sin_family || - a.inaddr.sin_addr.s_addr != a2.inaddr.sin_addr.s_addr || - a.inaddr.sin_port != a2.inaddr.sin_port) + if(memcmp(data[0], data[1], dlen)) goto error; sclose(listener); |