Fix Issue9753: socket.dup() does not always work right on Windows
diff --git a/Misc/NEWS b/Misc/NEWS
index 4053dd7..45e27c6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -155,6 +155,9 @@
Library
-------
+- Issue #9753: Fixed socket.dup, which did not always work correctly
+ on Windows.
+
- Issue #7005: Fixed output of None values for RawConfigParser.write and
ConfigParser.write.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 8c743d8..6ebb9d9 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -351,16 +351,13 @@
static SOCKET
dup_socket(SOCKET handle)
{
- HANDLE newhandle;
+ WSAPROTOCOL_INFO info;
- if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)handle,
- GetCurrentProcess(), &newhandle,
- 0, FALSE, DUPLICATE_SAME_ACCESS))
- {
- WSASetLastError(GetLastError());
+ if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
return INVALID_SOCKET;
- }
- return (SOCKET)newhandle;
+
+ return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
+ FROM_PROTOCOL_INFO, &info, 0, 0);
}
#define SOCKETCLOSE closesocket
#else