From f1ad942a1175105e4ab7d1cd98b842f84b3bcb2b Mon Sep 17 00:00:00 2001 From: Steven Noonan Date: Thu, 22 Apr 2021 17:24:05 -0700 Subject: [PATCH] SDL_windows_main: use HeapAlloc/HeapFree for command line arguments If a developer uses SDL_SetMemoryFunctions, we can't rely on SDL_free() working when SDL_main() returns. Signed-off-by: Steven Noonan Signed-off-by: Sam Lantinga --- src/main/windows/SDL_windows_main.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/windows/SDL_windows_main.c b/src/main/windows/SDL_windows_main.c index 6333f2c3a..056787e40 100644 --- a/src/main/windows/SDL_windows_main.c +++ b/src/main/windows/SDL_windows_main.c @@ -49,16 +49,29 @@ main_getcmdline(void) return OutOfMemory(); } + /* Note that we need to be careful about how we allocate/free memory here. + * If the application calls SDL_SetMemoryFunctions(), we can't rely on + * SDL_free() to use the same allocator after SDL_main() returns. + */ + /* Parse it into argv and argc */ - argv = (char **)SDL_calloc(argc + 1, sizeof(*argv)); + argv = (char **)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (argc + 1) * sizeof(*argv)); if (!argv) { return OutOfMemory(); } for (i = 0; i < argc; ++i) { - argv[i] = WIN_StringToUTF8W(argvw[i]); + DWORD len; + char *arg = WIN_StringToUTF8W(argvw[i]); + if (!arg) { + return OutOfMemory(); + } + len = (DWORD)SDL_strlen(arg); + argv[i] = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len + 1); if (!argv[i]) { return OutOfMemory(); } + CopyMemory(argv[i], arg, len); + SDL_free(arg); } argv[i] = NULL; LocalFree(argvw); @@ -70,9 +83,9 @@ main_getcmdline(void) /* Free argv, to avoid memory leak */ for (i = 0; i < argc; ++i) { - SDL_free(argv[i]); + HeapFree(GetProcessHeap(), 0, argv[i]); } - SDL_free(argv); + HeapFree(GetProcessHeap(), 0, argv); return result; }