From d2693d4c7d55352613a12bb27399d585a4c9e2c8 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 6 Feb 2025 12:40:13 -0500 Subject: [PATCH] dynapi: Don't use SDL_getenv; it might malloc before the app sets an allocator. Use platform-specific code instead, so SDL's allocator never comes into play. --- src/dynapi/SDL_dynapi.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/dynapi/SDL_dynapi.c b/src/dynapi/SDL_dynapi.c index 42dc8ed686..48f50954ae 100644 --- a/src/dynapi/SDL_dynapi.c +++ b/src/dynapi/SDL_dynapi.c @@ -440,7 +440,16 @@ extern SDL_NORETURN void SDL_ExitProcess(int exitcode); static void SDL_InitDynamicAPILocked(void) { - char *libname = SDL_getenv_REAL(SDL_DYNAMIC_API_ENVVAR); + /* this can't use SDL_getenv_REAL, because it might allocate memory before the app can set their allocator */ +#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) + /* We've always used LoadLibraryA for this, so this has never worked with Unicode paths on Windows. Sorry. */ + char envbuf[512]; /* overflows will just report as environment variable being unset, but LoadLibraryA has a MAX_PATH of 260 anyhow, apparently. */ + const DWORD rc = GetEnvironmentVariableA(SDL_DYNAMIC_API_ENVVAR, envbuf, (DWORD) sizeof (envbuf)); + char *libname = ((rc != 0) && (rc < sizeof (envbuf))) ? envbuf : NULL; +#else + char *libname = getenv(SDL_DYNAMIC_API_ENVVAR); +#endif + SDL_DYNAPI_ENTRYFN entry = NULL; /* funcs from here by default. */ SDL_bool use_internal = SDL_TRUE;