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 */ /* {