From d301cadcb00a756a92ece4bec15f1ed2db035c2d Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 26 Aug 2008 02:47:26 +0000 Subject: [PATCH] Couriersud fixed bug #603 Using the following sequence SDL_Init(..:) SDL_CreateWindow(..., SDL_WINDOW_OPENGL) SDL_DestroyWindow SDL_CreateWindow(..., SDL_WINDOW_OPENGL) SDL will crash in X11_GL_GetVisual. This is due to the fact that during SDL_DestroyWindow X11_GL_Shutdown was called because the last window has been closed. On the next call to SDL_CreateWindow the library is still loaded and only the memory is reinitialized. Function pointers such as gl_data->glXChooseVisual will not be reinitialized. Consequently, SDL will crash due to a NULL pointer access. The attached patch corrects the behaviour. --- src/video/x11/SDL_x11opengl.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c index 6e131e4ea..48323877e 100644 --- a/src/video/x11/SDL_x11opengl.c +++ b/src/video/x11/SDL_x11opengl.c @@ -73,26 +73,26 @@ X11_GL_LoadLibrary(_THIS, const char *path) void *handle; if (_this->gl_config.driver_loaded) { + /* do not return without reinitializing the function hooks */ if (path) { SDL_SetError("OpenGL library already loaded"); + } + handle = _this->gl_config.dll_handle; + } else { + if (path == NULL) { + path = SDL_getenv("SDL_OPENGL_LIBRARY"); + } + if (path == NULL) { + path = DEFAULT_OPENGL; + } + handle = GL_LoadObject(path); + if (!handle) { return -1; - } else { - ++_this->gl_config.driver_loaded; - return 0; } + _this->gl_config.dll_handle = handle; + SDL_strlcpy(_this->gl_config.driver_path, path, + SDL_arraysize(_this->gl_config.driver_path)); } - if (path == NULL) { - path = SDL_getenv("SDL_OPENGL_LIBRARY"); - } - if (path == NULL) { - path = DEFAULT_OPENGL; - } - handle = GL_LoadObject(path); - if (!handle) { - return -1; - } - // LoadLibrary may be called before WindowCreate! - // Must create the memory used by GL X11_GL_InitializeMemory(_this); /* Load new function pointers */ @@ -123,10 +123,7 @@ X11_GL_LoadLibrary(_THIS, const char *path) return -1; } - _this->gl_config.dll_handle = handle; - SDL_strlcpy(_this->gl_config.driver_path, path, - SDL_arraysize(_this->gl_config.driver_path)); - _this->gl_config.driver_loaded = 1; + ++_this->gl_config.driver_loaded; return 0; }