[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
This commit is contained in:
Eric Kohl 2018-05-31 16:47:42 +02:00
parent 528e6339c2
commit 0f8e720711
3 changed files with 20 additions and 9 deletions

View File

@ -49,6 +49,7 @@ list(APPEND SOURCE
RtlMemoryStream.c
RtlNtPathNameToDosPathName.c
RtlpEnsureBufferSize.c
RtlQueryTimeZoneInfo.c
RtlReAllocateHeap.c
RtlUnicodeStringToAnsiString.c
RtlUpcaseUnicodeStringToCountedOemString.c

View 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 },

View 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);
}
}
}