# HG changeset patch # User Ryan C. Gordon # Date 1420438056 18000 # Node ID 0c66e0df64f6fab02bbc9d63ebd33780ab989767 # Parent e64d9374f1be0635e3a6713569f2864a424fd046 Dynamic API: don't leak if a library loaded but didn't have the entry point. diff -r e64d9374f1be -r 0c66e0df64f6 src/dynapi/SDL_dynapi.c --- a/src/dynapi/SDL_dynapi.c Wed Dec 31 21:00:32 2014 +0100 +++ b/src/dynapi/SDL_dynapi.c Mon Jan 05 01:07:36 2015 -0500 @@ -206,7 +206,14 @@ static SDL_INLINE void *get_sdlapi_entry(const char *fname, const char *sym) { HANDLE lib = LoadLibraryA(fname); - return lib ? GetProcAddress(lib, sym) : NULL; + void *retval = NULL; + if (lib) { + retval = GetProcAddress(lib, sym); + if (retval == NULL) { + FreeLibrary(lib); + } + } + return retval; } #elif defined(__HAIKU__) @@ -215,8 +222,11 @@ { image_id lib = load_add_on(fname); void *retval = NULL; - if ((lib < 0) || (get_image_symbol(lib, sym, B_SYMBOL_TYPE_TEXT, &retval) != B_NO_ERROR)) { - retval = NULL; + if (lib >= 0) { + if (get_image_symbol(lib, sym, B_SYMBOL_TYPE_TEXT, &retval) != B_NO_ERROR) { + unload_add_on(lib); + retval = NULL; + } } return retval; } @@ -225,7 +235,14 @@ static SDL_INLINE void *get_sdlapi_entry(const char *fname, const char *sym) { void *lib = dlopen(fname, RTLD_NOW | RTLD_LOCAL); - return lib ? dlsym(lib, sym) : NULL; + void *retval = NULL; + if (lib != NULL) { + retval = dlsym(lib, sym); + if (retval == NULL) { + dlclose(lib); + } + } + return retval; } #else #error Please define your platform.