Skip to content

Commit

Permalink
Fixed bug 3790 - Memory leak with surfaces blitting on each other
Browse files Browse the repository at this point in the history
bastien.bouclet

When creating two surfaces and blitting them onto the other, SDL's internal reference counting fails, and one of the surfaces is not freed when calling SDL_FreeSurface.

Example code :

SDL_Surface *s1 = SDL_CreateRGBSurfaceWithFormat(0, 640, 480, 32, SDL_PIXELFORMAT_ARGB8888);
SDL_Surface *s2 = SDL_CreateRGBSurfaceWithFormat(0, 640, 480, 32, SDL_PIXELFORMAT_ARGB8888);

SDL_BlitSurface(s1, NULL, s2, NULL);
SDL_BlitSurface(s2, NULL, s1, NULL);

SDL_FreeSurface(s2);
SDL_FreeSurface(s1);

With this example, s1 is not freed after calling SDL_FreeSurface, its refcount attribute is still positive.
  • Loading branch information
slouken committed Sep 4, 2017
1 parent 532446a commit 67f9348
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/video/SDL_surface.c
Expand Up @@ -1193,6 +1193,10 @@ SDL_FreeSurface(SDL_Surface * surface)
if (surface->flags & SDL_DONTFREE) {
return;
}
if (surface->map != NULL) {
SDL_FreeBlitMap(surface->map);
surface->map = NULL;
}
if (--surface->refcount > 0) {
return;
}
Expand All @@ -1207,10 +1211,6 @@ SDL_FreeSurface(SDL_Surface * surface)
SDL_FreeFormat(surface->format);
surface->format = NULL;
}
if (surface->map != NULL) {
SDL_FreeBlitMap(surface->map);
surface->map = NULL;
}
if (!(surface->flags & SDL_PREALLOC)) {
SDL_free(surface->pixels);
}
Expand Down

0 comments on commit 67f9348

Please sign in to comment.