Module: wine Branch: master Commit: 7ebb621e833a96118383f6d37944d25390f6988c URL: https://gitlab.winehq.org/wine/wine/-/commit/7ebb621e833a96118383f6d37944d25...
Author: Alex Henrie alexhenrie24@gmail.com Date: Sun Dec 11 22:45:22 2022 -0700
shell32: Handle memory allocation failure in Dde_OnRequest (cppcheck).
---
dlls/shell32/dde.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/dlls/shell32/dde.c b/dlls/shell32/dde.c index 96b5a243f93..10bdb11501f 100644 --- a/dlls/shell32/dde.c +++ b/dlls/shell32/dde.c @@ -145,9 +145,9 @@ static inline HDDEDATA Dde_OnRequest(UINT uFmt, HCONV hconv, HSZ hszTopic, WIN32_FIND_DATAW finddata; HANDLE hfind; int len = 1; - WCHAR *groups_data = malloc(sizeof(WCHAR)); + WCHAR *groups_data = malloc(sizeof(WCHAR)), *new_groups_data; char *groups_dataA; - HDDEDATA ret; + HDDEDATA ret = NULL;
groups_data[0] = 0; programs = get_programs_path(L"*", FALSE); @@ -160,7 +160,14 @@ static inline HDDEDATA Dde_OnRequest(UINT uFmt, HCONV hconv, HSZ hszTopic, wcscmp(finddata.cFileName, L".") && wcscmp(finddata.cFileName, L"..")) { len += lstrlenW(finddata.cFileName) + 2; - groups_data = realloc(groups_data, len * sizeof(WCHAR)); + new_groups_data = realloc(groups_data, len * sizeof(WCHAR)); + if (!new_groups_data) + { + free(groups_data); + free(programs); + return NULL; + } + groups_data = new_groups_data; lstrcatW(groups_data, finddata.cFileName); lstrcatW(groups_data, L"\r\n"); } @@ -170,8 +177,11 @@ static inline HDDEDATA Dde_OnRequest(UINT uFmt, HCONV hconv, HSZ hszTopic,
len = WideCharToMultiByte(CP_ACP, 0, groups_data, -1, NULL, 0, NULL, NULL); groups_dataA = malloc(len * sizeof(WCHAR)); - WideCharToMultiByte(CP_ACP, 0, groups_data, -1, groups_dataA, len, NULL, NULL); - ret = DdeCreateDataHandle(dwDDEInst, (BYTE *)groups_dataA, len, 0, hszGroups, uFmt, 0); + if (groups_dataA) + { + WideCharToMultiByte(CP_ACP, 0, groups_data, -1, groups_dataA, len, NULL, NULL); + ret = DdeCreateDataHandle(dwDDEInst, (BYTE *)groups_dataA, len, 0, hszGroups, uFmt, 0); + }
free(groups_dataA); free(groups_data);