[PATCH 6/8] regedit: Call RegEnumValueW with value and val_count parameters.
Bernhard Übelacker
bernhardu at vr-web.de
Tue Jun 30 07:38:04 CDT 2015
Bug #38796 (preparation)
---
programs/regedit/treeview.c | 32 +++++++++++++++++++++++---------
1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/programs/regedit/treeview.c b/programs/regedit/treeview.c
index 0ac5252..008e6a1 100644
--- a/programs/regedit/treeview.c
+++ b/programs/regedit/treeview.c
@@ -226,9 +226,10 @@ static BOOL match_item(HWND hwndTV, HTREEITEM hItem, LPCWSTR sstring, int mode,
if (mode & (SEARCH_VALUES | SEARCH_CONTENT)) {
int i, adjust;
- WCHAR valName[KEY_MAX_LEN], *KeyPath;
+ WCHAR *valName, *KeyPath;
HKEY hKey, hRoot;
- DWORD lenName;
+ DWORD lenName, lenNameMax, lenValueMax;
+ WCHAR *buffer = NULL;
KeyPath = GetItemPath(hwndTV, hItem, &hRoot);
@@ -241,7 +242,14 @@ static BOOL match_item(HWND hwndTV, HTREEITEM hItem, LPCWSTR sstring, int mode,
}
HeapFree(GetProcessHeap(), 0, KeyPath);
- lenName = KEY_MAX_LEN;
+
+ if (ERROR_SUCCESS != RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &lenNameMax, &lenValueMax, NULL, NULL))
+ return FALSE;
+
+ lenName = ++lenNameMax;
+ if (!(valName = HeapAlloc(GetProcessHeap(), 0, lenName * sizeof(valName[0]) )))
+ return FALSE;
+
adjust = 0;
/* RegEnumValue won't return empty default value, so fake it when dealing with *row,
which corresponds to list view rows, not value ids */
@@ -252,14 +260,16 @@ static BOOL match_item(HWND hwndTV, HTREEITEM hItem, LPCWSTR sstring, int mode,
if (i < 0) i = 0;
while(1) {
DWORD lenValue = 0, type = 0;
- lenName = KEY_MAX_LEN;
+ lenName = lenNameMax;
if (ERROR_SUCCESS != RegEnumValueW(hKey,
- i, valName, &lenName, NULL, &type, NULL, &lenValue))
+ i, valName, &lenName, NULL, &type, NULL, NULL))
break;
if (mode & SEARCH_VALUES) {
if (match_string(valName, sstring, mode)) {
+ HeapFree(GetProcessHeap(), 0, valName);
+ HeapFree(GetProcessHeap(), 0, buffer);
RegCloseKey(hKey);
*row = i+adjust;
return TRUE;
@@ -267,23 +277,27 @@ static BOOL match_item(HWND hwndTV, HTREEITEM hItem, LPCWSTR sstring, int mode,
}
if ((mode & SEARCH_CONTENT) && (type == REG_EXPAND_SZ || type == REG_SZ)) {
- LPWSTR buffer;
- buffer = HeapAlloc(GetProcessHeap(), 0, lenValue);
+ if (!buffer)
+ buffer = HeapAlloc(GetProcessHeap(), 0, lenValueMax);
if (!buffer)
break;
- if (ERROR_SUCCESS != RegEnumValueW(hKey, i, NULL, NULL, NULL, &type, (LPBYTE)buffer, &lenValue))
+ lenName = lenNameMax;
+ lenValue = lenValueMax;
+ if (ERROR_SUCCESS != RegEnumValueW(hKey, i, valName, &lenName, NULL, &type, (LPBYTE)buffer, &lenValue))
break;
if (match_string(buffer, sstring, mode)) {
+ HeapFree(GetProcessHeap(), 0, valName);
HeapFree(GetProcessHeap(), 0, buffer);
RegCloseKey(hKey);
*row = i+adjust;
return TRUE;
}
- HeapFree(GetProcessHeap(), 0, buffer);
}
i++;
}
+ HeapFree(GetProcessHeap(), 0, valName);
+ HeapFree(GetProcessHeap(), 0, buffer);
RegCloseKey(hKey);
}
return FALSE;
--
2.1.4
More information about the wine-patches
mailing list