From 529664278f842ba47575257a235b09580ab7dbf4 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 5 Oct 2013 19:09:03 -0700 Subject: [PATCH] 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. --- src/test/SDL_test_common.c | 6 ++++++ test/testdraw2.c | 2 ++ test/testgl2.c | 2 ++ test/testgles.c | 2 ++ test/testime.c | 2 ++ test/testintersections.c | 2 ++ test/testrelative.c | 2 ++ test/testrendercopyex.c | 2 ++ test/testrendertarget.c | 2 ++ test/testscale.c | 2 ++ test/testsprite2.c | 2 ++ 11 files changed, 26 insertions(+) diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c index 05d72a2788..4e9429e63f 100644 --- a/src/test/SDL_test_common.c +++ b/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; diff --git a/test/testdraw2.c b/test/testdraw2.c index 926294bfec..62e2dbf64a 100644 --- a/test/testdraw2.c +++ b/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); diff --git a/test/testgl2.c b/test/testgl2.c index 642fe47c62..19685eae1d 100644 --- a/test/testgl2.c +++ b/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); diff --git a/test/testgles.c b/test/testgles.c index 7a790bd9d7..daaa28c7c5 100644 --- a/test/testgles.c +++ b/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()); diff --git a/test/testime.c b/test/testime.c index 93b33e0c60..3d9789ad68 100644 --- a/test/testime.c +++ b/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); diff --git a/test/testintersections.c b/test/testintersections.c index 237bd3511e..b4deeecd01 100644 --- a/test/testintersections.c +++ b/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); diff --git a/test/testrelative.c b/test/testrelative.c index 478d3bf77c..9e8e1e2d0e 100644 --- a/test/testrelative.c +++ b/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); diff --git a/test/testrendercopyex.c b/test/testrendercopyex.c index 5033c1c5f2..0c8ad7defd 100644 --- a/test/testrendercopyex.c +++ b/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]); } } diff --git a/test/testrendertarget.c b/test/testrendertarget.c index 4f49dce752..ac4aa50040 100644 --- a/test/testrendertarget.c +++ b/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 { diff --git a/test/testscale.c b/test/testscale.c index f81ccdc243..8449f233d9 100644 --- a/test/testscale.c +++ b/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]); } } diff --git a/test/testsprite2.c b/test/testsprite2.c index b40efd3f87..e0e1cf4931 100644 --- a/test/testsprite2.c +++ b/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]); } }