From: Sven Baars sbaars@codeweavers.com
--- dlls/ntdll/reg.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index ccf83d59c28..0834e221fbc 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -311,6 +311,7 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, RtlInitUnicodeString(&src, data); res = 0; dst.MaximumLength = 0; + dst.Buffer = NULL; RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res); if (str->MaximumLength < res) return STATUS_BUFFER_TOO_SMALL; @@ -379,6 +380,7 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, RtlInitUnicodeString(&src, data); res = 0; dst.MaximumLength = 0; + dst.Buffer = NULL; RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res); dst.Length = 0; dst.MaximumLength = res;
From: Sven Baars sbaars@codeweavers.com
--- dlls/ntdll/tests/directory.c | 1 + dlls/ntdll/tests/reg.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/tests/directory.c b/dlls/ntdll/tests/directory.c index 40cd993e92c..526bd0c0c69 100644 --- a/dlls/ntdll/tests/directory.c +++ b/dlls/ntdll/tests/directory.c @@ -1182,6 +1182,7 @@ static void test_NtQueryDirectoryFile_change_mask(void)
done: tear_down_mask_test(testdir); + pRtlFreeUnicodeString(&ntdirname); pNtClose(&dirh); }
diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index 2b03be04416..952db9f594b 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -440,6 +440,7 @@ static void test_NtCreateKey(void) pRtlCreateUnicodeStringFromAsciiz( &str, "test_subkey\" ); status = pNtCreateKey( &subkey, am, &attr, 0, 0, 0, 0 ); ok( status == STATUS_SUCCESS, "NtCreateKey failed: 0x%08lx\n", status ); + pRtlFreeUnicodeString( &str );
pRtlCreateUnicodeStringFromAsciiz( &str, "test_subkey\" ); status = pNtCreateKey( &subkey, am, &attr, 0, 0, 0, 0 ); @@ -451,6 +452,7 @@ static void test_NtCreateKey(void) pRtlCreateUnicodeStringFromAsciiz( &str, "test_subkey2\\" ); status = pNtCreateKey( &subkey, am, &attr, 0, 0, 0, 0 ); ok( status == STATUS_SUCCESS, "NtCreateKey failed: 0x%08lx\n", status ); + pRtlFreeUnicodeString( &str ); pRtlCreateUnicodeStringFromAsciiz( &str, "test_subkey2\\test\\" ); status = pNtCreateKey( &subkey2, am, &attr, 0, 0, 0, 0 ); ok( status == STATUS_SUCCESS, "NtCreateKey failed: 0x%08lx\n", status ); @@ -1344,7 +1346,11 @@ static DWORD get_key_value( HANDLE root, const char *name, DWORD flags ) pRtlCreateUnicodeStringFromAsciiz( &str, name );
status = pNtOpenKey( &key, flags | KEY_ALL_ACCESS, &attr ); - if (status == STATUS_OBJECT_NAME_NOT_FOUND) return 0; + if (status == STATUS_OBJECT_NAME_NOT_FOUND) + { + pRtlFreeUnicodeString( &str ); + return 0; + } ok( status == STATUS_SUCCESS, "%08lx: NtCreateKey failed: 0x%08lx\n", flags, status );
status = pNtQueryValueKey( key, &value_str, KeyValuePartialInformation, info, len, &len );
From: Sven Baars sbaars@codeweavers.com
This fixes a crash when value_data is equal to 0xdeadbeef. --- dlls/ntdll/tests/reg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index 952db9f594b..2f008d3156d 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -2547,7 +2547,7 @@ static NTSTATUS WINAPI query_routine(const WCHAR *value_name, ULONG value_type, ULONG expected_type;
trace("Value name: %s\n", debugstr_w(value_name)); - trace("Value data: %s\n", debugstr_w(value_data)); + if (value_data_size) trace("Value data: %s\n", debugstr_w(value_data));
if (!(test->flags & SKIP_NAME_CHECK)) {
From: Sven Baars sbaars@codeweavers.com
--- dlls/ntdll/tests/string.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/tests/string.c b/dlls/ntdll/tests/string.c index 3d975d12a10..787756daf14 100644 --- a/dlls/ntdll/tests/string.c +++ b/dlls/ntdll/tests/string.c @@ -1689,19 +1689,19 @@ static void test__snwprintf(void) memset(buffer, 0xcc, sizeof(buffer)); res = p_snwprintf(buffer, 3, L"test"); ok(res == -1, "res = %d\n", res); - ok(!memcmp(buffer, L"tes", 3 * sizeof(WCHAR)), "buf = %s\n", debugstr_w(buffer)); + ok(!memcmp(buffer, L"tes", 3 * sizeof(WCHAR)), "buf = %s\n", debugstr_wn(buffer, 3)); ok(buffer[3] == 0xcccc, "buffer[3] = %x\n", buffer[3]);
memset(buffer, 0xcc, sizeof(buffer)); res = p_snwprintf(buffer, 4, L"%s", L"test"); ok(res == 4, "res = %d\n", res); - ok(!memcmp(buffer, L"test", 4 * sizeof(WCHAR)), "buf = %s\n", debugstr_w(buffer)); + ok(!memcmp(buffer, L"test", 4 * sizeof(WCHAR)), "buf = %s\n", debugstr_wn(buffer, 4)); ok(buffer[4] == 0xcccc, "buffer[4] = %x\n", buffer[4]);
memset(buffer, 0xcc, sizeof(buffer)); res = p_snwprintf(buffer, 3, L"%s", L"test"); ok(res == -1, "res = %d\n", res); - ok(!memcmp(buffer, L"tes", 3), "buf = %s\n", debugstr_w(buffer)); + ok(!memcmp(buffer, L"tes", 3), "buf = %s\n", debugstr_wn(buffer, 3)); ok(buffer[3] == 0xcccc, "buffer[3] = %x\n", buffer[3]);
res = p_snwprintf(buffer, ARRAY_SIZE(buffer), L"%I64x %d", (ULONGLONG)0x1234567890, 1);
Alexandre Julliard (@julliard) commented about dlls/ntdll/reg.c:
RtlInitUnicodeString(&src, data); res = 0; dst.MaximumLength = 0;
dst.Buffer = NULL;
This should probably be addressed in RtlExpandEnvironmentStrings_U instead of patching the callers.