]> www.infradead.org Git - users/dwmw2/openconnect.git/commitdiff
Latest version of vendored dumb_socketpair()
authorDimitri Papadopoulos <3350651-DimitriPapadopoulos@users.noreply.gitlab.com>
Tue, 28 Dec 2021 10:13:57 +0000 (11:13 +0100)
committerDimitri Papadopoulos <3350651-DimitriPapadopoulos@users.noreply.gitlab.com>
Tue, 28 Dec 2021 10:13:57 +0000 (11:13 +0100)
These are minor changes, except the return value which really is an
integer error status, not a socket.

Signed-off-by: Dimitri Papadopoulos <3350651-DimitriPapadopoulos@users.noreply.gitlab.com>
compat.c
openconnect-internal.h

index c3a295523031a81f4a0aef723e6a8ca760991dee..b3c5be5db814be19623c24206e4ce34665cfcd43 100644 (file)
--- a/compat.c
+++ b/compat.c
@@ -320,7 +320,7 @@ int openconnect__win32_inet_pton(int af, const char *src, void *dst)
        }
 }
 
-/* https://github.com/ncm/selectable-socketpair
+/* https://github.com/ncm/selectable-socketpair/blob/master/socketpair.c
 
 Copyright 2007, 2010 by Nathan C. Myers <ncm@cantrip.org>
 Redistribution and use in source and binary forms, with or without modification,
@@ -348,6 +348,11 @@ WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  */
 
 /* Changes:
+ * 2014-02-12: merge David Woodhouse, Ger Hobbelt improvements
+ *     git.infradead.org/users/dwmw2/openconnect.git/commitdiff/bdeefa54
+ *     github.com/GerHobbelt/selectable-socketpair
+ *   always init the socks[] to -1/INVALID_SOCKET on error, both on Win32/64
+ *   and UNIX/other platforms
  * 2013-07-18: Change to BSD 3-clause license
  * 2010-03-31:
  *   set addr to 127.0.0.1 because win32 getsockname does not always set it.
@@ -367,7 +372,7 @@ WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 
 #include <string.h>
 
-# include <winsock2.h>
+# include <ws2tcpip.h>  /* socklen_t, et al (MSVC20xx) */
 # include <windows.h>
 # include <io.h>
 
@@ -379,7 +384,7 @@ WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  *   sockets must be closed with closesocket() regardless.
  */
 
-OPENCONNECT_CMD_SOCKET dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped)
+int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped)
 {
     union {
         struct sockaddr_in inaddr;
@@ -395,6 +400,7 @@ OPENCONNECT_CMD_SOCKET dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make
         WSASetLastError(WSAEINVAL);
         return SOCKET_ERROR;
     }
+    socks[0] = socks[1] = -1;
 
     listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     if (listener == INVALID_SOCKET)
@@ -405,8 +411,7 @@ OPENCONNECT_CMD_SOCKET dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make
     a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
     a.inaddr.sin_port = 0;
 
-    socks[0] = socks[1] = -1;
-    do {
+    for (;;) {
         if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,
                (char *) &reuse, (socklen_t) sizeof(reuse)) == -1)
             break;
@@ -417,7 +422,7 @@ OPENCONNECT_CMD_SOCKET dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make
         if (getsockname(listener, &a.addr, &addrlen) == SOCKET_ERROR)
             break;
         // win32 getsockname may only set the port number, p=0.0005.
-        // ( https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-getsockname ):
+        // ( https://docs.microsoft.com/windows/win32/api/winsock/nf-winsock-getsockname ):
         a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
         a.inaddr.sin_family = AF_INET;
 
@@ -437,13 +442,14 @@ OPENCONNECT_CMD_SOCKET dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make
         closesocket(listener);
         return 0;
 
-    } while (0);
+    }
 
     e = WSAGetLastError();
     closesocket(listener);
     closesocket(socks[0]);
     closesocket(socks[1]);
     WSASetLastError(e);
+    socks[0] = socks[1] = -1;
     return SOCKET_ERROR;
 }
-#endif /* _WIN32 */
+#endif
index 0a909a048fdd5608d5dc6e0aff45310a52429f7c..b3fd398d213ddd41c49040e79b9f3dede7801cc8 100644 (file)
@@ -1116,7 +1116,7 @@ int openconnect__win32_setenv(const char *name, const char *value, int overwrite
 #define inet_pton openconnect__win32_inet_pton
 int openconnect__win32_inet_pton(int af, const char *src, void *dst);
 #define OPENCONNECT_CMD_SOCKET SOCKET
-OPENCONNECT_CMD_SOCKET dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped);
+int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped);
 #else
 #define closesocket close
 #define OPENCONNECT_CMD_SOCKET int