summaryrefslogtreecommitdiff
path: root/lib/socketpair.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2021-06-03 12:12:13 +0200
committerDaniel Stenberg <daniel@haxx.se>2021-06-03 12:12:16 +0200
commit3e70c3430a370a31eff2c1d8fea29edaca8f1127 (patch)
tree4f0ca5cfbc21194b91176e66eba53cac2476fe9e /lib/socketpair.c
parentc769d1eab4de8b9f1bd84d992c63692fdc43c5be (diff)
downloadcurl-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.c34
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);