]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
Revert "socketpair: fix potential hangs"
authorDaniel Stenberg <daniel@haxx.se>
Thu, 3 Jun 2021 10:12:13 +0000 (12:12 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 3 Jun 2021 10:12:16 +0000 (12:12 +0200)
This reverts commit c769d1eab4de8b9f1bd84d992c63692fdc43c5be.

See #7144 for details

lib/socketpair.c

index 26e1dc66d7d3e237b6b9ac552e944dcf7d96d061..2c580ad2dec9d17c6485707e906ebfb74cecd0ba 100644 (file)
 #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);