瀏覽代碼

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 12 年之前
父節點
當前提交
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);
                 SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);
                 if (window) {
                 if (window) {
                     SDL_DestroyWindow(window);
                     SDL_DestroyWindow(window);
+                    for (i = 0; i < state->num_windows; ++i) {
+                        if (window == state->windows[i]) {
+                            state->windows[i] = NULL;
+                            break;
+                        }
+                    }
                 }
                 }
             }
             }
             break;
             break;

+ 2 - 0
test/testdraw2.c

@@ -253,6 +253,8 @@ main(int argc, char *argv[])
         }
         }
         for (i = 0; i < state->num_windows; ++i) {
         for (i = 0; i < state->num_windows; ++i) {
             SDL_Renderer *renderer = state->renderers[i];
             SDL_Renderer *renderer = state->renderers[i];
+            if (state->windows[i] == NULL)
+                continue;
             SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
             SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
             SDL_RenderClear(renderer);
             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) {
         for (i = 0; i < state->num_windows; ++i) {
             int w, h;
             int w, h;
+            if (state->windows[i] == NULL)
+                continue;
             SDL_GL_MakeCurrent(state->windows[i], context);
             SDL_GL_MakeCurrent(state->windows[i], context);
             SDL_GL_GetDrawableSize(state->windows[i], &w, &h);
             SDL_GL_GetDrawableSize(state->windows[i], &w, &h);
             glViewport(0, 0, 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);
             SDLTest_CommonEvent(state, &event, &done);
         }
         }
         for (i = 0; i < state->num_windows; ++i) {
         for (i = 0; i < state->num_windows; ++i) {
+            if (state->windows[i] == NULL)
+                continue;
             status = SDL_GL_MakeCurrent(state->windows[i], context[i]);
             status = SDL_GL_MakeCurrent(state->windows[i], context[i]);
             if (status) {
             if (status) {
                 SDL_Log("SDL_GL_MakeCurrent(): %s\n", SDL_GetError());
                 SDL_Log("SDL_GL_MakeCurrent(): %s\n", SDL_GetError());

+ 2 - 0
test/testime.c

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

+ 2 - 0
test/testrendercopyex.c

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

+ 2 - 0
test/testrendertarget.c

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

+ 2 - 0
test/testscale.c

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

+ 2 - 0
test/testsprite2.c

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