Fixed bug 2629 - Mac: crash when calling SDL_DestroyWindow with an active OpenGL context
authorSam Lantinga <slouken@libsdl.org>
Mon, 07 Jul 2014 10:33:32 -0700
changeset 8978 7753e4fd3d1d
parent 8977 84ae33058c67
child 8979 1e283b7a1580
Fixed bug 2629 - Mac: crash when calling SDL_DestroyWindow with an active OpenGL context Alex Szpakowski Since this commit https://hg.libsdl.org/SDL/rev/1519c462cee6 , calling SDL_DestroyWindow will crash the program if the window has an active OpenGL context. This is because the Cocoa_DestroyWindow code sets the window's driverdata to NULL and then calls [context setWindow:NULL], which tries to access the window's driverdata, resulting in a null pointer dereference. I have attached a patch which fixes the issue by moving the line which sets the driverdata to NULL to after the lines which call functions that use the driverdata pointer.
src/video/cocoa/SDL_cocoawindow.m
src/video/mir/SDL_mirwindow.c
src/video/uikit/SDL_uikitwindow.m
src/video/wayland/SDL_waylandwindow.c
src/video/windows/SDL_windowswindow.c
src/video/x11/SDL_x11window.c
--- a/src/video/cocoa/SDL_cocoawindow.m	Sun Jul 06 22:15:31 2014 +0100
+++ b/src/video/cocoa/SDL_cocoawindow.m	Mon Jul 07 10:33:32 2014 -0700
@@ -1544,8 +1544,6 @@
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
 
-    window->driverdata = NULL;
-
     if (data) {
         [data->listener close];
         [data->listener release];
@@ -1562,6 +1560,8 @@
 
         SDL_free(data);
     }
+    window->driverdata = NULL;
+
     [pool release];
 }
 
--- a/src/video/mir/SDL_mirwindow.c	Sun Jul 06 22:15:31 2014 +0100
+++ b/src/video/mir/SDL_mirwindow.c	Mon Jul 07 10:33:32 2014 -0700
@@ -149,14 +149,13 @@
     MIR_Data* mir_data = _this->driverdata;
     MIR_Window* mir_window = window->driverdata;
 
-    window->driverdata = NULL;
-
     if (mir_data) {
         SDL_EGL_DestroySurface(_this, mir_window->egl_surface);
         MIR_mir_surface_release_sync(mir_window->surface);
 
         SDL_free(mir_window);
     }
+    window->driverdata = NULL;
 }
 
 SDL_bool
--- a/src/video/uikit/SDL_uikitwindow.m	Sun Jul 06 22:15:31 2014 +0100
+++ b/src/video/uikit/SDL_uikitwindow.m	Mon Jul 07 10:33:32 2014 -0700
@@ -290,13 +290,12 @@
 {
     SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
 
-    window->driverdata = NULL;
-
     if (data) {
         [data->viewcontroller release];
         [data->uiwindow release];
         SDL_free(data);
     }
+    window->driverdata = NULL;
 }
 
 SDL_bool
--- a/src/video/wayland/SDL_waylandwindow.c	Sun Jul 06 22:15:31 2014 +0100
+++ b/src/video/wayland/SDL_waylandwindow.c	Mon Jul 07 10:33:32 2014 -0700
@@ -243,8 +243,6 @@
     SDL_VideoData *data = _this->driverdata;
     SDL_WindowData *wind = window->driverdata;
 
-    window->driverdata = NULL;
-
     if (data) {
         SDL_EGL_DestroySurface(_this, wind->egl_surface);
         WAYLAND_wl_egl_window_destroy(wind->egl_window);
@@ -261,6 +259,7 @@
         SDL_free(wind);
         WAYLAND_wl_display_flush(data->display);
     }
+    window->driverdata = NULL;
 }
 
 #endif /* SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL */
--- a/src/video/windows/SDL_windowswindow.c	Sun Jul 06 22:15:31 2014 +0100
+++ b/src/video/windows/SDL_windowswindow.c	Mon Jul 07 10:33:32 2014 -0700
@@ -619,8 +619,6 @@
 {
     SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
 
-    window->driverdata = NULL;
-
     if (data) {
         ReleaseDC(data->hwnd, data->hdc);
         if (data->created) {
@@ -639,6 +637,7 @@
         }
         SDL_free(data);
     }
+    window->driverdata = NULL;
 }
 
 SDL_bool
--- a/src/video/x11/SDL_x11window.c	Sun Jul 06 22:15:31 2014 +0100
+++ b/src/video/x11/SDL_x11window.c	Mon Jul 07 10:33:32 2014 -0700
@@ -1394,8 +1394,6 @@
 {
     SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
 
-    window->driverdata = NULL;
-
     if (data) {
         SDL_VideoData *videodata = (SDL_VideoData *) data->videodata;
         Display *display = videodata->display;
@@ -1424,6 +1422,7 @@
         }
         SDL_free(data);
     }
+    window->driverdata = NULL;
 }
 
 SDL_bool