From 96305832bc0e1cecd35c193a0934046830ea8a02 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 11 Aug 2017 10:21:19 -0700 Subject: [PATCH] Fixed bug 3702 - Clear error messages of SDL_LoadObject for optional libraries Simon Hug Some code in SDL loads libraries with SDL_LoadObject to get more information or use newer APIs. SDL_LoadObject may fail, set an error message and SDL will continue with some fallback code. Since SDL will overwrite the error or exit the function with a return value that indicates success, the error form SDL_LoadObject for the optional stuff might as well be cleared right away. --- src/audio/SDL_audio.c | 1 + src/video/SDL_egl.c | 4 +++- src/video/windows/SDL_windowskeyboard.c | 1 + src/video/windows/SDL_windowsvideo.c | 4 ++++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index 1243721a8f8a3..120555f9c222c 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -150,6 +150,7 @@ LoadLibSampleRate(void) SDL_assert(SRC_lib == NULL); SRC_lib = SDL_LoadObject(SDL_LIBSAMPLERATE_DYNAMIC); if (!SRC_lib) { + SDL_ClearError(); return SDL_FALSE; } diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index ed0feb4c3c160..20884afc4167d 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -269,7 +269,9 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa } } if (SDL_strcasecmp(d3dcompiler, "none") != 0) { - SDL_LoadObject(d3dcompiler); + if (SDL_LoadObject(d3dcompiler) == NULL) { + SDL_ClearError(); + } } #endif diff --git a/src/video/windows/SDL_windowskeyboard.c b/src/video/windows/SDL_windowskeyboard.c index 2018a30657224..7e79c6fa493ea 100644 --- a/src/video/windows/SDL_windowskeyboard.c +++ b/src/video/windows/SDL_windowskeyboard.c @@ -351,6 +351,7 @@ IME_Init(SDL_VideoData *videodata, HWND hwnd) videodata->ime_himm32 = SDL_LoadObject("imm32.dll"); if (!videodata->ime_himm32) { videodata->ime_available = SDL_FALSE; + SDL_ClearError(); return; } videodata->ImmLockIMC = (LPINPUTCONTEXT2 (WINAPI *)(HIMC))SDL_LoadFunction(videodata->ime_himm32, "ImmLockIMC"); diff --git a/src/video/windows/SDL_windowsvideo.c b/src/video/windows/SDL_windowsvideo.c index 4b180c3af8d74..f6fc6f4e4199d 100644 --- a/src/video/windows/SDL_windowsvideo.c +++ b/src/video/windows/SDL_windowsvideo.c @@ -113,11 +113,15 @@ WIN_CreateDevice(int devindex) data->CloseTouchInputHandle = (BOOL (WINAPI *)(HTOUCHINPUT)) SDL_LoadFunction(data->userDLL, "CloseTouchInputHandle"); data->GetTouchInputInfo = (BOOL (WINAPI *)(HTOUCHINPUT, UINT, PTOUCHINPUT, int)) SDL_LoadFunction(data->userDLL, "GetTouchInputInfo"); data->RegisterTouchWindow = (BOOL (WINAPI *)(HWND, ULONG)) SDL_LoadFunction(data->userDLL, "RegisterTouchWindow"); + } else { + SDL_ClearError(); } data->shcoreDLL = SDL_LoadObject("SHCORE.DLL"); if (data->shcoreDLL) { data->GetDpiForMonitor = (HRESULT (WINAPI *)(HMONITOR, MONITOR_DPI_TYPE, UINT *, UINT *)) SDL_LoadFunction(data->shcoreDLL, "GetDpiForMonitor"); + } else { + SDL_ClearError(); } /* Set the function pointers */