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 05d72a278..4e9429e63 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 926294bfe..62e2dbf64 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 642fe47c6..19685eae1 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 7a790bd9d..daaa28c7c 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 93b33e0c6..3d9789ad6 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 237bd3511..b4deeecd0 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 478d3bf77..9e8e1e2d0 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 5033c1c5f..0c8ad7def 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 4f49dce75..ac4aa5004 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 f81ccdc24..8449f233d 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 b40efd3f8..e0e1cf493 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]); } }