Commit 40c921f8 authored by Jay Satiro's avatar Jay Satiro
Browse files

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: default avatarMarcel Raad <MarcelRaad@users.noreply.github.com>
parent 7a8e861a
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -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;
+11 −11
Original line number Diff line number Diff line
@@ -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