From: Alex Henrie alexhenrie24@gmail.com
--- dlls/ntdll/reg.c | 11 ++++------- dlls/ntdll/tests/reg.c | 4 ++-- 2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index 4af8f5edb9b..37619db2032 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -285,13 +285,10 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, res = 0; dst.MaximumLength = 0; RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res); - dst.Length = 0; - dst.MaximumLength = res; - dst.Buffer = RtlAllocateHeap(GetProcessHeap(), 0, res * sizeof(WCHAR)); - RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res); - status = pQuery->QueryRoutine(pQuery->Name, pInfo->Type, dst.Buffer, - dst.Length, pContext, pQuery->EntryContext); - RtlFreeHeap(GetProcessHeap(), 0, dst.Buffer); + if (str->MaximumLength < res) + return STATUS_BUFFER_TOO_SMALL; + RtlExpandEnvironmentStrings_U(pEnvironment, &src, str, &res); + break; }
case REG_SZ: diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index 3785070c962..acb6967fc7b 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -2659,11 +2659,11 @@ static struct query_reg_values_test query_reg_values_tests[] = /* DIRECT doesn't call the query routine and reads directly into a buffer */ { {{ query_routine, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"WindowsDrive", &query_reg_values_direct_str }}, - STATUS_INVALID_PARAMETER, 0, WINE_TODO_RET | WINE_TODO_CALLS | WINE_TODO_NAME | WINE_TODO_TYPE | WINE_TODO_SIZE | WINE_TODO_DATA + STATUS_INVALID_PARAMETER, 0, WINE_TODO_RET | WINE_TODO_NAME | WINE_TODO_TYPE | WINE_TODO_SIZE | WINE_TODO_DATA }, { {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"WindowsDrive", &query_reg_values_direct_str }}, - STATUS_SUCCESS, 0, WINE_CRASH, REG_SZ, L"C:" + STATUS_SUCCESS, 0, 0, REG_SZ, L"C:" }, /* DIRECT on a multi-string crashes on Windows without NOEXPAND */ /* {
From: Alex Henrie alexhenrie24@gmail.com
--- dlls/ntdll/reg.c | 4 ++-- dlls/ntdll/tests/reg.c | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index 37619db2032..d4bf530537a 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -265,7 +265,7 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, memcpy(str->Buffer, pQuery->DefaultData, default_size); return STATUS_SUCCESS; } - else + else if (pQuery->QueryRoutine) { status = pQuery->QueryRoutine(pQuery->Name, pQuery->DefaultType, pQuery->DefaultData, pQuery->DefaultLength, pContext, pQuery->EntryContext); @@ -336,7 +336,7 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, break; } } - else + else if (pQuery->QueryRoutine) { if((pQuery->Flags & RTL_QUERY_REGISTRY_NOEXPAND) || (pInfo->Type != REG_EXPAND_SZ && pInfo->Type != REG_MULTI_SZ)) diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index acb6967fc7b..aad08a0c63d 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -2636,7 +2636,11 @@ static struct query_reg_values_test query_reg_values_tests[] = /* Name without query routine or DIRECT */ { {{ NULL, 0, (WCHAR*)L"WindowsDrive" }}, - STATUS_SUCCESS, 0, WINE_CRASH + STATUS_SUCCESS, 0 + }, + { + {{ NULL, 0, (WCHAR*)L"I don't exist" }}, + STATUS_SUCCESS, 0 }, /* The query routine is called for every value in current key */ {
From: Alex Henrie alexhenrie24@gmail.com
--- dlls/ntdll/tests/reg.c | 7 ------- 1 file changed, 7 deletions(-)
diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index aad08a0c63d..5906ff9a627 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -2548,7 +2548,6 @@ struct query_reg_values_test WINE_TODO_TYPE = 0x80, WINE_TODO_SIZE = 0x100, WINE_TODO_DATA = 0x200, - WINE_CRASH = 0x400, } flags; ULONG expected_type; @@ -2817,12 +2816,6 @@ static void test_RtlQueryRegistryValues(void) const WCHAR *expected_data; ULONG expected_size;
- if ((test->flags & WINE_CRASH) && !strcmp(winetest_platform, "wine")) - { - skip("Currently crashes on Wine\n"); - continue; - } - winetest_push_context("%u/%Iu", i, ARRAY_SIZE(query_reg_values_tests) - 1);
for (query = test->query_table; query->QueryRoutine || query->Name; query++)