From 4692b037db0b3dd5f66e0a8598a21516856c59c0 Mon Sep 17 00:00:00 2001 From: Dens Maloov Date: Mon, 18 Nov 2024 08:25:11 +0000 Subject: [PATCH 1/4] Complete dumb_socketpair() implementation --- compat.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/compat.c b/compat.c index b00ac83e..9dea037a 100644 --- a/compat.c +++ b/compat.c @@ -395,8 +395,11 @@ struct sockaddr_un { * sockets must be closed with closesocket() regardless. */ -int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped) +int dumb_socketpair_full(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped, int no_inherit_flag) { + /* + * WSA_FLAG_NO_HANDLE_INHERIT flag is a Windows equivalent for SOCK_CLOEXEC + */ union { struct sockaddr_un unaddr; struct sockaddr_in inaddr; @@ -406,7 +409,7 @@ int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped) int e, ii; int domain = AF_UNIX; socklen_t addrlen = sizeof(a.unaddr); - DWORD flags = (make_overlapped ? WSA_FLAG_OVERLAPPED : 0); + DWORD flags = (make_overlapped ? WSA_FLAG_OVERLAPPED : 0) | (no_inherit_flag ? WSA_FLAG_NO_HANDLE_INHERIT : 0); int reuse = 1; if (socks == 0) { @@ -423,7 +426,7 @@ int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped) * on earlier versions of Windows. */ for (ii = 0; ii < 2; ii++) { - listener = socket(domain, SOCK_STREAM, domain == AF_INET ? IPPROTO_TCP : 0); + listener = WSASocket(domain, SOCK_STREAM, domain == AF_INET ? IPPROTO_TCP : 0, NULL, 0, (WSA_FLAG_OVERLAPPED | (no_inherit_flag ? WSA_FLAG_NO_HANDLE_INHERIT : 0))); if (listener == INVALID_SOCKET) goto fallback; @@ -513,7 +516,7 @@ int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped) if (domain == AF_UNIX) DeleteFile(a.unaddr.sun_path); // Socket file no longer needed - socks[1] = accept(listener, NULL, NULL); + socks[1] = WSAAccept(listener, NULL, NULL, NULL, 0); if (socks[1] == INVALID_SOCKET) goto fallback; @@ -534,4 +537,9 @@ int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped) socks[0] = socks[1] = -1; return SOCKET_ERROR; } + +int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped) +{ + dumb_socketpair_full(socks, make_overlapped, 1); +} #endif -- GitLab From 76e3f4636ef62494d09f121f27387efd45f7fd8f Mon Sep 17 00:00:00 2001 From: Dens Maloov Date: Wed, 20 Nov 2024 07:59:06 +0000 Subject: [PATCH 2/4] Update compat.c --- compat.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/compat.c b/compat.c index 9dea037a..0bb97c84 100644 --- a/compat.c +++ b/compat.c @@ -517,6 +517,11 @@ int dumb_socketpair_full(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped, i DeleteFile(a.unaddr.sun_path); // Socket file no longer needed socks[1] = WSAAccept(listener, NULL, NULL, NULL, 0); + /* + * once WSAAccept(listener, NULL, NULL, NULL, 0) has done its work, + * the newly created socket (socks[1]) copies + * WSA_FLAG_NO_HANDLE_INHERIT flag value from listener to itself + */ if (socks[1] == INVALID_SOCKET) goto fallback; -- GitLab From 3cfcd5c6d7865cedea2eee224c3d099e4c61d332 Mon Sep 17 00:00:00 2001 From: Dens Maloov Date: Wed, 20 Nov 2024 09:21:35 +0000 Subject: [PATCH 3/4] Fixed comment --- compat.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compat.c b/compat.c index 0bb97c84..d2674445 100644 --- a/compat.c +++ b/compat.c @@ -518,8 +518,8 @@ int dumb_socketpair_full(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped, i socks[1] = WSAAccept(listener, NULL, NULL, NULL, 0); /* - * once WSAAccept(listener, NULL, NULL, NULL, 0) has done its work, - * the newly created socket (socks[1]) copies + * This is how WSAAccept works: once WSAAccept(listener, NULL, NULL, NULL, 0) + * has done its work, the newly created socket (socks[1]) copies * WSA_FLAG_NO_HANDLE_INHERIT flag value from listener to itself */ if (socks[1] == INVALID_SOCKET) -- GitLab From 3cd9c4aea858556b7c4e3ad12144bb5dacd2b0c9 Mon Sep 17 00:00:00 2001 From: Dens Maloov Date: Fri, 22 Nov 2024 15:13:54 +0000 Subject: [PATCH 4/4] Apply dumb_socketpair() invariant used before this merge request. --- compat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compat.c b/compat.c index d2674445..36638d86 100644 --- a/compat.c +++ b/compat.c @@ -545,6 +545,6 @@ int dumb_socketpair_full(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped, i int dumb_socketpair(OPENCONNECT_CMD_SOCKET socks[2], int make_overlapped) { - dumb_socketpair_full(socks, make_overlapped, 1); + dumb_socketpair_full(socks, make_overlapped, 0); } #endif -- GitLab