Pārlūkot izejas kodu

Fixed bug 2132 - Tests may use invalid SDL_window pointers when windows are closed

norfanin

Some of the tests keep using the pointers of a destroyed SDL_Window when the common event handling handled the close event. The event handler itself does not NULL the pointer after the destruction.

The attached patch adds a loop in the handler that will assign NULL to the destroyed window. It also adds checks to some of the tests so they skip those windows by checking for NULL.
Sam Lantinga 11 gadi atpakaļ
vecāks
revīzija
529664278f

+ 6 - 0
src/test/SDL_test_common.c

@@ -1200,6 +1200,12 @@ SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done)
                 SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);
                 if (window) {
                     SDL_DestroyWindow(window);
+                    for (i = 0; i < state->num_windows; ++i) {
+                        if (window == state->windows[i]) {
+                            state->windows[i] = NULL;
+                            break;
+                        }
+                    }
                 }
             }
             break;

+ 2 - 0
test/testdraw2.c

@@ -253,6 +253,8 @@ main(int argc, char *argv[])
         }
         for (i = 0; i < state->num_windows; ++i) {
             SDL_Renderer *renderer = state->renderers[i];
+            if (state->windows[i] == NULL)
+                continue;
             SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
             SDL_RenderClear(renderer);
 

+ 2 - 0
test/testgl2.c

@@ -340,6 +340,8 @@ main(int argc, char *argv[])
         }
         for (i = 0; i < state->num_windows; ++i) {
             int w, h;
+            if (state->windows[i] == NULL)
+                continue;
             SDL_GL_MakeCurrent(state->windows[i], context);
             SDL_GL_GetDrawableSize(state->windows[i], &w, &h);
             glViewport(0, 0, w, h);

+ 2 - 0
test/testgles.c

@@ -312,6 +312,8 @@ main(int argc, char *argv[])
             SDLTest_CommonEvent(state, &event, &done);
         }
         for (i = 0; i < state->num_windows; ++i) {
+            if (state->windows[i] == NULL)
+                continue;
             status = SDL_GL_MakeCurrent(state->windows[i], context[i]);
             if (status) {
                 SDL_Log("SDL_GL_MakeCurrent(): %s\n", SDL_GetError());

+ 2 - 0
test/testime.c

@@ -196,6 +196,8 @@ void Redraw() {
     int i;
     for (i = 0; i < state->num_windows; ++i) {
         SDL_Renderer *renderer = state->renderers[i];
+        if (state->windows[i] == NULL)
+            continue;
         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
         SDL_RenderClear(renderer);
 

+ 2 - 0
test/testintersections.c

@@ -310,6 +310,8 @@ main(int argc, char *argv[])
         }
         for (i = 0; i < state->num_windows; ++i) {
             SDL_Renderer *renderer = state->renderers[i];
+            if (state->windows[i] == NULL)
+                continue;
             SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
             SDL_RenderClear(renderer);
 

+ 2 - 0
test/testrelative.c

@@ -84,6 +84,8 @@ main(int argc, char *argv[])
         }
         for (i = 0; i < state->num_windows; ++i) {
             SDL_Renderer *renderer = state->renderers[i];
+            if (state->windows[i] == NULL)
+                continue;
             SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
             SDL_RenderClear(renderer);
 

+ 2 - 0
test/testrendercopyex.c

@@ -188,6 +188,8 @@ main(int argc, char *argv[])
             SDLTest_CommonEvent(state, &event, &done);
         }
         for (i = 0; i < state->num_windows; ++i) {
+            if (state->windows[i] == NULL)
+                continue;
             Draw(&drawstates[i]);
         }
     }

+ 2 - 0
test/testrendertarget.c

@@ -285,6 +285,8 @@ main(int argc, char *argv[])
             SDLTest_CommonEvent(state, &event, &done);
         }
         for (i = 0; i < state->num_windows; ++i) {
+            if (state->windows[i] == NULL)
+                continue;
             if (test_composite) {
                 if (!DrawComposite(&drawstates[i])) done = 1;
             } else {

+ 2 - 0
test/testscale.c

@@ -178,6 +178,8 @@ main(int argc, char *argv[])
             SDLTest_CommonEvent(state, &event, &done);
         }
         for (i = 0; i < state->num_windows; ++i) {
+            if (state->windows[i] == NULL)
+                continue;
             Draw(&drawstates[i]);
         }
     }

+ 2 - 0
test/testsprite2.c

@@ -360,6 +360,8 @@ main(int argc, char *argv[])
             SDLTest_CommonEvent(state, &event, &done);
         }
         for (i = 0; i < state->num_windows; ++i) {
+            if (state->windows[i] == NULL)
+                continue;
             MoveSprites(state->renderers[i], sprites[i]);
         }
     }