Windows: Fix VerifyVersionInfo calls

- Fix the VerifyVersionInfo calls, which we use to test for the OS major
version, to also test for the minor version as well as the service pack
major and minor versions.

MSDN: "If you are testing the major version, you must also test the
minor version and the service pack major and minor versions."

https://msdn.microsoft.com/en-us/library/windows/desktop/ms725492.aspx

Bug: https://github.com/bagder/curl/pull/353#issuecomment-123493098
Reported-by: Marcel Raad <MarcelRaad@users.noreply.github.com>
This commit is contained in:
Jay Satiro 2015-07-22 01:52:17 -04:00
parent 7a8e861a56
commit 40c921f8b8
2 changed files with 20 additions and 19 deletions

View File

@ -949,16 +949,17 @@ void Curl_sndbufset(curl_socket_t sockfd)
detectOsState = DETECT_OS_VISTA_OR_LATER;
}
#else
ULONGLONG majorVersionMask;
OSVERSIONINFOEX osver;
ULONGLONG cm;
OSVERSIONINFOEX osver = { sizeof osver, majorVersion, };
memset(&osver, 0, sizeof(osver));
osver.dwOSVersionInfoSize = sizeof(osver);
osver.dwMajorVersion = majorVersion;
majorVersionMask = VerSetConditionMask(0, VER_MAJORVERSION,
VER_GREATER_EQUAL);
cm = VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL);
cm = VerSetConditionMask(cm, VER_MINORVERSION, VER_GREATER_EQUAL);
cm = VerSetConditionMask(cm, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
cm = VerSetConditionMask(cm, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL);
if(VerifyVersionInfo(&osver, VER_MAJORVERSION, majorVersionMask))
if(VerifyVersionInfo(&osver, (VER_MAJORVERSION | VER_MINORVERSION |
VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR),
cm))
detectOsState = DETECT_OS_VISTA_OR_LATER;
else
detectOsState = DETECT_OS_PREVISTA;

View File

@ -93,20 +93,20 @@ CURLcode Curl_sspi_global_init(void)
osver.dwPlatformId == platformId)
securityDll = TRUE;
#else
ULONGLONG majorVersionMask;
ULONGLONG platformIdMask;
OSVERSIONINFOEX osver;
ULONGLONG cm;
OSVERSIONINFOEX osver = { sizeof osver, majorVersion, 0, 0, platformId, };
memset(&osver, 0, sizeof(osver));
osver.dwOSVersionInfoSize = sizeof(osver);
osver.dwMajorVersion = majorVersion;
osver.dwPlatformId = platformId;
majorVersionMask = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL);
platformIdMask = VerSetConditionMask(0, VER_PLATFORMID, VER_EQUAL);
cm = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL);
cm = VerSetConditionMask(cm, VER_MINORVERSION, VER_GREATER_EQUAL);
cm = VerSetConditionMask(cm, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
cm = VerSetConditionMask(cm, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL);
cm = VerSetConditionMask(cm, VER_PLATFORMID, VER_EQUAL);
/* Verify the major version number == 4 and platform id == WIN_NT */
if(VerifyVersionInfo(&osver, VER_MAJORVERSION, majorVersionMask) &&
VerifyVersionInfo(&osver, VER_PLATFORMID, platformIdMask))
if(VerifyVersionInfo(&osver, (VER_MAJORVERSION | VER_MINORVERSION |
VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR |
VER_PLATFORMID),
cm))
securityDll = TRUE;
#endif