From 76370aa3b41c0efb416ecbfb0a25067a44cbaffd Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 12 Apr 2016 13:01:35 +0000 Subject: [PATCH] [ADVAPI32] - Fix null termination in RegQueryInfoKeyA. Based on Wine commit 303daeef by Alexandre Juilliard. svn path=/trunk/; revision=71149 --- reactos/dll/win32/advapi32/reg/reg.c | 2 +- rostests/winetests/advapi32/registry.c | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/advapi32/reg/reg.c b/reactos/dll/win32/advapi32/reg/reg.c index 263e0f962b3..a692fbe0e23 100644 --- a/reactos/dll/win32/advapi32/reg/reg.c +++ b/reactos/dll/win32/advapi32/reg/reg.c @@ -3645,7 +3645,7 @@ RegQueryInfoKeyA(HKEY hKey, FALSE); ErrorCode = RtlNtStatusToDosError(Status); cClass = AnsiString.Length; - lpClass[*lpcClass - 1] = 0; + lpClass[cClass] = ANSI_NULL; } if (lpcClass != NULL) diff --git a/rostests/winetests/advapi32/registry.c b/rostests/winetests/advapi32/registry.c index 407c18bc9a8..82f573a432c 100644 --- a/rostests/winetests/advapi32/registry.c +++ b/rostests/winetests/advapi32/registry.c @@ -2,7 +2,7 @@ * Unit tests for registry functions * * Copyright (c) 2002 Alexandre Julliard - * Copyright (c) 2010 André Hentschel + * Copyright (c) 2010 André Hentschel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -1997,6 +1997,17 @@ static void test_reg_query_info(void) "classbuffer = \"%.*s\", expected %s\n", (int)sizeof(classbuffer), classbuffer, expectbuffer); + memset(classbuffer, 0x55, sizeof(classbuffer)); + classlen = 0xdeadbeef; + ret = RegQueryInfoKeyA(subkey, classbuffer, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + ok(ret == ERROR_SUCCESS, "ret = %d\n", ret); + ok(classlen == sizeof(subkey_class) - 1, "classlen = %u\n", classlen); + memset(expectbuffer, 0x55, sizeof(expectbuffer)); + strcpy(expectbuffer, subkey_class); + ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)), + "classbuffer = \"%.*s\", expected %s\n", + (int)sizeof(classbuffer), classbuffer, expectbuffer); + memset(classbufferW, 0x55, sizeof(classbufferW)); classlen = sizeof(subkey_class); ret = RegQueryInfoKeyW(subkey, classbufferW, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); @@ -2008,6 +2019,17 @@ static void test_reg_query_info(void) "classbufferW = %s, expected %s\n", wine_dbgstr_wn(classbufferW, sizeof(classbufferW) / sizeof(WCHAR)), wine_dbgstr_w(expectbufferW)); + memset(classbufferW, 0x55, sizeof(classbufferW)); + classlen = 0xdeadbeef; + ret = RegQueryInfoKeyW(subkey, classbufferW, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + ok(ret == ERROR_SUCCESS, "ret = %d\n", ret); + ok(classlen == sizeof(subkey_class) - 1, "classlen = %u\n", classlen); + memset(expectbufferW, 0x55, sizeof(expectbufferW)); + lstrcpyW(expectbufferW, subkey_classW); + ok(!memcmp(classbufferW, expectbufferW, sizeof(classbufferW)), + "classbufferW = %s, expected %s\n", + wine_dbgstr_wn(classbufferW, sizeof(classbufferW) / sizeof(WCHAR)), wine_dbgstr_w(expectbufferW)); + RegDeleteKeyA(subsubkey, ""); RegCloseKey(subsubkey); RegDeleteKeyA(subkey, ""); -- 2.17.1