winecfg: Support color profiles larger than MAX_PATH chars.

Signed-off-by: Stefan Dösinger <stefan@codeweavers.com>
This commit is contained in:
Stefan Dösinger 2022-06-28 13:55:00 +03:00 committed by Alexandre Julliard
parent 905dbb8f8b
commit 021eefdee0

View file

@ -22,6 +22,7 @@
* *
*/ */
#include <assert.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -554,15 +555,25 @@ static void set_color_from_theme(const WCHAR *keyName, COLORREF color)
static void do_parse_theme(WCHAR *file) static void do_parse_theme(WCHAR *file)
{ {
WCHAR keyName[MAX_PATH], keyNameValue[MAX_PATH]; WCHAR *keyName, keyNameValue[MAX_PATH];
DWORD len, allocLen = 512;
WCHAR *keyNamePtr = NULL; WCHAR *keyNamePtr = NULL;
int red = 0, green = 0, blue = 0; int red = 0, green = 0, blue = 0;
COLORREF color; COLORREF color;
WINE_TRACE("%s\n", wine_dbgstr_w(file)); WINE_TRACE("%s\n", wine_dbgstr_w(file));
keyName = malloc(sizeof(*keyName) * allocLen);
for (;;)
{
assert(keyName);
len = GetPrivateProfileStringW(L"Control Panel\\Colors", NULL, NULL, keyName,
allocLen, file);
if (len < allocLen - 2)
break;
GetPrivateProfileStringW(L"Control Panel\\Colors", NULL, NULL, keyName, allocLen *= 2;
MAX_PATH, file); keyName = realloc(keyName, sizeof(*keyName) * allocLen);
}
keyNamePtr = keyName; keyNamePtr = keyName;
while (*keyNamePtr!=0) { while (*keyNamePtr!=0) {
@ -580,6 +591,7 @@ static void do_parse_theme(WCHAR *file)
keyNamePtr+=lstrlenW(keyNamePtr); keyNamePtr+=lstrlenW(keyNamePtr);
keyNamePtr++; keyNamePtr++;
} }
free(keyName);
} }
static void on_theme_install(HWND dialog) static void on_theme_install(HWND dialog)