https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0f8e720711532d6020021…
commit 0f8e720711532d60200211ab7c6dce80e023b68f
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Thu May 31 16:47:42 2018 +0200
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Thu May 31 16:47:42 2018 +0200
[NTDLL_APITEST][LIB_RTL] Add a test for RtlQueryTimeZoneInformation and fix the bug in
RtlpQueryRegistryDirect
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 | 1 +
modules/rostests/apitests/ntdll/testlist.c | 2 ++
sdk/lib/rtl/registry.c | 26 +++++++++++++++++---------
3 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/modules/rostests/apitests/ntdll/CMakeLists.txt
b/modules/rostests/apitests/ntdll/CMakeLists.txt
index 3e9756c7f3..a7fdc5a2cd 100644
--- a/modules/rostests/apitests/ntdll/CMakeLists.txt
+++ b/modules/rostests/apitests/ntdll/CMakeLists.txt
@@ -49,6 +49,7 @@ list(APPEND SOURCE
RtlMemoryStream.c
RtlNtPathNameToDosPathName.c
RtlpEnsureBufferSize.c
+ RtlQueryTimeZoneInfo.c
RtlReAllocateHeap.c
RtlUnicodeStringToAnsiString.c
RtlUpcaseUnicodeStringToCountedOemString.c
diff --git a/modules/rostests/apitests/ntdll/testlist.c
b/modules/rostests/apitests/ntdll/testlist.c
index f17f87267c..c6afd1d342 100644
--- a/modules/rostests/apitests/ntdll/testlist.c
+++ b/modules/rostests/apitests/ntdll/testlist.c
@@ -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 },
diff --git a/sdk/lib/rtl/registry.c b/sdk/lib/rtl/registry.c
index 02361efc48..bc69d4d0b3 100644
--- a/sdk/lib/rtl/registry.c
+++ b/sdk/lib/rtl/registry.c
@@ -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);
+ }
}
}