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 <steven@valvesoftware.com> Signed-off-by: Sam Lantinga <slouken@libsdl.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
diff --git a/src/main/windows/SDL_windows_main.c b/src/main/windows/SDL_windows_main.c
index 6333f2c..056787e 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;
}