[NTDLL_APITEST][LIB_RTL] Add a test for RtlQueryTimeZoneInformation and fix the bug...
authorEric Kohl <eric.kohl@reactos.org>
Thu, 31 May 2018 14:47:42 +0000 (16:47 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Thu, 31 May 2018 14:47:42 +0000 (16:47 +0200)
In working on some problems with Time Zone adjustments in  ReactOS I found that the RtlQueryTimeZoneInformation function is partially broken and wrote an apitest to capture the failures.

Patch by Doug Lyons.

CORE-14658

modules/rostests/apitests/ntdll/CMakeLists.txt
modules/rostests/apitests/ntdll/testlist.c
sdk/lib/rtl/registry.c

index 3e9756c..a7fdc5a 100644 (file)
@@ -49,6 +49,7 @@ list(APPEND SOURCE
     RtlMemoryStream.c
     RtlNtPathNameToDosPathName.c
     RtlpEnsureBufferSize.c
+    RtlQueryTimeZoneInfo.c
     RtlReAllocateHeap.c
     RtlUnicodeStringToAnsiString.c
     RtlUpcaseUnicodeStringToCountedOemString.c
index f17f872..c6afd1d 100644 (file)
@@ -53,6 +53,7 @@ extern void func_RtlIsNameLegalDOS8Dot3(void);
 extern void func_RtlMemoryStream(void);
 extern void func_RtlNtPathNameToDosPathName(void);
 extern void func_RtlpEnsureBufferSize(void);
+extern void func_RtlQueryTimeZoneInformation(void);
 extern void func_RtlReAllocateHeap(void);
 extern void func_RtlUnicodeStringToAnsiString(void);
 extern void func_RtlUpcaseUnicodeStringToCountedOemString(void);
@@ -111,6 +112,7 @@ const struct test winetest_testlist[] =
     { "RtlMemoryStream",                func_RtlMemoryStream },
     { "RtlNtPathNameToDosPathName",     func_RtlNtPathNameToDosPathName },
     { "RtlpEnsureBufferSize",           func_RtlpEnsureBufferSize },
+    { "RtlQueryTimeZoneInformation",    func_RtlQueryTimeZoneInformation },
     { "RtlReAllocateHeap",              func_RtlReAllocateHeap },
     { "RtlUnicodeStringToAnsiString",   func_RtlUnicodeStringToAnsiString },
     { "RtlUpcaseUnicodeStringToCountedOemString", func_RtlUpcaseUnicodeStringToCountedOemString },
index 02361ef..bc69d4d 100644 (file)
@@ -96,17 +96,25 @@ RtlpQueryRegistryDirect(IN ULONG ValueType,
         }
         else
         {
-            /* Check if there's space for the length and type, plus data */
-            if (*Length < (2 * sizeof(ULONG) + ValueLength))
+            if (ValueType != REG_BINARY)
             {
-                /* Nope, fail */
-                return STATUS_BUFFER_TOO_SMALL;
-            }
+                /* Check if there's space for the length and type, plus data */
+                if (*Length < (2 * sizeof(ULONG) + ValueLength))
+                {
+                    /* Nope, fail */
+                    return STATUS_BUFFER_TOO_SMALL;
+                }
 
-            /* Return the data */
-            *Length++ = ValueLength;
-            *Length++ = ValueType;
-            RtlCopyMemory(Length, ValueData, ValueLength);
+                /* Return the data */
+                *Length++ = ValueLength;
+                *Length++ = ValueType;
+                RtlCopyMemory(Length, ValueData, ValueLength);
+            }
+            else
+            {
+                /* Return the REG_BINARY data */
+                RtlCopyMemory(Length, ValueData, ValueLength);
+            }
         }
     }