Sebastian Lackner : ntdll: Fix condition mask handling in RtlVerifyVersionInfo.

Alexandre Julliard julliard at winehq.org
Mon May 14 06:54:24 CDT 2018


Module: wine
Branch: stable
Commit: f7f77089619f8df30054e36cb54eddb11063340b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f7f77089619f8df30054e36cb54eddb11063340b

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Tue Feb 27 14:18:38 2018 +0300

ntdll: Fix condition mask handling in RtlVerifyVersionInfo.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 004d32dae6cbb419e926fb9c6ad410d17b68f56c)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/kernel32/tests/version.c | 14 -------------
 dlls/ntdll/version.c          | 49 +++++++++++++++++++++++++++++++------------
 2 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index 8360994..e4f4a9f 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -201,9 +201,6 @@ static void test_VerifyVersionInfo(void)
 
             VER_MAJORVERSION, VER_EQUAL,
             VER_MINORVERSION, VER_LESS,
-            0, 0,
-            0, 0,
-            TRUE,
         },
         {
             VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
@@ -284,9 +281,6 @@ static void test_VerifyVersionInfo(void)
 
             VER_SERVICEPACKMAJOR, VER_EQUAL,
             VER_SERVICEPACKMINOR, VER_LESS,
-            0, 0,
-            0, 0,
-            TRUE,
         },
         {
             VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
@@ -304,8 +298,6 @@ static void test_VerifyVersionInfo(void)
             VER_MINORVERSION, VER_EQUAL,
             VER_SERVICEPACKMAJOR, VER_EQUAL,
             VER_SERVICEPACKMINOR, VER_LESS,
-            0, 0,
-            TRUE,
         },
         {
             VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
@@ -325,7 +317,6 @@ static void test_VerifyVersionInfo(void)
             VER_MINORVERSION, VER_EQUAL,
             VER_SERVICEPACKMAJOR, VER_EQUAL,
             VER_SERVICEPACKMINOR, VER_LESS,
-            TRUE,
         },
         {
             VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
@@ -368,9 +359,6 @@ static void test_VerifyVersionInfo(void)
 
             VER_MAJORVERSION, VER_EQUAL,
             VER_SERVICEPACKMAJOR, VER_LESS,
-            0, 0,
-            0, 0,
-            TRUE,
         },
         {
             VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
@@ -388,8 +376,6 @@ static void test_VerifyVersionInfo(void)
             VER_MAJORVERSION, VER_EQUAL,
             VER_MINORVERSION, VER_EQUAL,
             VER_SERVICEPACKMAJOR, VER_LESS,
-            0, 0,
-            TRUE
         },
         {
             VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
diff --git a/dlls/ntdll/version.c b/dlls/ntdll/version.c
index 58ccb95..1674261 100644
--- a/dlls/ntdll/version.c
+++ b/dlls/ntdll/version.c
@@ -657,6 +657,34 @@ BOOLEAN WINAPI RtlGetNtProductType( LPDWORD type )
     return TRUE;
 }
 
+static inline UCHAR version_update_condition(UCHAR *last_condition, UCHAR condition)
+{
+    switch (*last_condition)
+    {
+        case 0:
+            *last_condition = condition;
+            break;
+        case VER_EQUAL:
+            if (condition >= VER_EQUAL && condition <= VER_LESS_EQUAL)
+            {
+                *last_condition = condition;
+                return condition;
+            }
+            break;
+        case VER_GREATER:
+        case VER_GREATER_EQUAL:
+            if (condition >= VER_EQUAL && condition <= VER_GREATER_EQUAL)
+                return condition;
+            break;
+        case VER_LESS:
+        case VER_LESS_EQUAL:
+            if (condition == VER_EQUAL || (condition >= VER_LESS && condition <= VER_LESS_EQUAL))
+                return condition;
+            break;
+    }
+    if (!condition) *last_condition |= 0x10;
+    return *last_condition & 0xf;
+}
 
 static inline NTSTATUS version_compare_values(ULONG left, ULONG right, UCHAR condition)
 {
@@ -733,38 +761,33 @@ NTSTATUS WINAPI RtlVerifyVersionInfo( const RTL_OSVERSIONINFOEXW *info,
 
     if(dwTypeMask & (VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR))
     {
-        unsigned char condition = 0;
+        unsigned char condition, last_condition = 0;
         BOOLEAN do_next_check = TRUE;
 
         if(dwTypeMask & VER_MAJORVERSION)
-            condition = dwlConditionMask >> 1*3 & 0x07;
-        else if(dwTypeMask & VER_MINORVERSION)
-            condition = dwlConditionMask >> 0*3 & 0x07;
-        else if(dwTypeMask & VER_SERVICEPACKMAJOR)
-            condition = dwlConditionMask >> 5*3 & 0x07;
-        else if(dwTypeMask & VER_SERVICEPACKMINOR)
-            condition = dwlConditionMask >> 4*3 & 0x07;
-
-        if(dwTypeMask & VER_MAJORVERSION)
         {
+            condition = version_update_condition(&last_condition, dwlConditionMask >> 1*3 & 0x07);
             status = version_compare_values(ver.dwMajorVersion, info->dwMajorVersion, condition);
             do_next_check = (ver.dwMajorVersion == info->dwMajorVersion) &&
-                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
+                ((condition >= VER_EQUAL) && (condition <= VER_LESS_EQUAL));
         }
         if((dwTypeMask & VER_MINORVERSION) && do_next_check)
         {
+            condition = version_update_condition(&last_condition, dwlConditionMask >> 0*3 & 0x07);
             status = version_compare_values(ver.dwMinorVersion, info->dwMinorVersion, condition);
             do_next_check = (ver.dwMinorVersion == info->dwMinorVersion) &&
-                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
+                ((condition >= VER_EQUAL) && (condition <= VER_LESS_EQUAL));
         }
         if((dwTypeMask & VER_SERVICEPACKMAJOR) && do_next_check)
         {
+            condition = version_update_condition(&last_condition, dwlConditionMask >> 5*3 & 0x07);
             status = version_compare_values(ver.wServicePackMajor, info->wServicePackMajor, condition);
             do_next_check = (ver.wServicePackMajor == info->wServicePackMajor) &&
-                ((condition != VER_EQUAL) || (status == STATUS_SUCCESS));
+                ((condition >= VER_EQUAL) && (condition <= VER_LESS_EQUAL));
         }
         if((dwTypeMask & VER_SERVICEPACKMINOR) && do_next_check)
         {
+            condition = version_update_condition(&last_condition, dwlConditionMask >> 4*3 & 0x07);
             status = version_compare_values(ver.wServicePackMinor, info->wServicePackMinor, condition);
         }
 




More information about the wine-cvs mailing list