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.
This commit is contained in:
Sam Lantinga 2013-10-05 19:09:03 -07:00
parent 0db36f51aa
commit 529664278f
11 changed files with 26 additions and 0 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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());

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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]);
} }
} }

View file

@ -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 {

View file

@ -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]);
} }
} }

View file

@ -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]);
} }
} }