mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
bpo-32394: Remove some TCP options on old version Windows. (GH-5523)
This commit is contained in:
parent
3f2e6f15d6
commit
19e7d48ce8
4 changed files with 101 additions and 0 deletions
|
@ -305,6 +305,70 @@ http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&
|
|||
/* Provides the IsWindows7SP1OrGreater() function */
|
||||
#include <VersionHelpers.h>
|
||||
|
||||
/* remove some flags on older version Windows during run-time.
|
||||
https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
|
||||
typedef struct {
|
||||
DWORD build_number; /* available starting with this Win10 BuildNumber */
|
||||
const char flag_name[20];
|
||||
} FlagRuntimeInfo;
|
||||
|
||||
/* IMPORTANT: make sure the list ordered by descending build_number */
|
||||
static FlagRuntimeInfo win_runtime_flags[] = {
|
||||
/* available starting with Windows 10 1709 */
|
||||
{16299, "TCP_KEEPIDLE"},
|
||||
{16299, "TCP_KEEPINTVL"},
|
||||
/* available starting with Windows 10 1703 */
|
||||
{15063, "TCP_KEEPCNT"},
|
||||
/* available starting with Windows 10 1607 */
|
||||
{14393, "TCP_FASTOPEN"}
|
||||
};
|
||||
|
||||
static void
|
||||
remove_unusable_flags(PyObject *m)
|
||||
{
|
||||
PyObject *dict;
|
||||
OSVERSIONINFOEX info;
|
||||
DWORDLONG dwlConditionMask;
|
||||
|
||||
dict = PyModule_GetDict(m);
|
||||
if (dict == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* set to Windows 10, except BuildNumber. */
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.dwOSVersionInfoSize = sizeof(info);
|
||||
info.dwMajorVersion = 10;
|
||||
info.dwMinorVersion = 0;
|
||||
|
||||
/* set Condition Mask */
|
||||
dwlConditionMask = 0;
|
||||
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
|
||||
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
|
||||
VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
|
||||
|
||||
for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
|
||||
info.dwBuildNumber = win_runtime_flags[i].build_number;
|
||||
/* greater than or equal to the specified version?
|
||||
Compatibility Mode will not cheat VerifyVersionInfo(...) */
|
||||
if (VerifyVersionInfo(
|
||||
&info,
|
||||
VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
|
||||
dwlConditionMask)) {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if (PyDict_GetItemString(
|
||||
dict,
|
||||
win_runtime_flags[i].flag_name) != NULL) {
|
||||
PyDict_DelItemString(
|
||||
dict,
|
||||
win_runtime_flags[i].flag_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
|
@ -7890,5 +7954,11 @@ PyInit__socket(void)
|
|||
#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
|
||||
netdb_lock = PyThread_allocate_lock();
|
||||
#endif
|
||||
|
||||
#ifdef MS_WINDOWS
|
||||
/* remove some flags on older version Windows during run-time */
|
||||
remove_unusable_flags(m);
|
||||
#endif
|
||||
|
||||
return m;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue