From 7d47f526a7630e9c03ce29bb48c9b98e9dddf742 Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Tue, 1 Oct 2019 09:26:30 +0200 Subject: [PATCH] SDL_LockTextureToSurface: robustness of locked region compared to texture size --- src/render/SDL_render.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 2ea2504a350f4..fb770d47a4116 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -1684,7 +1684,7 @@ int SDL_LockTextureToSurface(SDL_Texture *texture, const SDL_Rect *rect, SDL_Surface **surface) { - SDL_Rect r; + SDL_Rect real_rect; void *pixels = NULL; int pitch, ret; @@ -1692,24 +1692,21 @@ SDL_LockTextureToSurface(SDL_Texture *texture, const SDL_Rect *rect, return -1; } - if (rect == NULL) { - r.x = 0; - r.y = 0; - r.w = texture->w; - r.h = texture->h; - } else { - r.x = rect->x; - r.y = rect->y; - r.w = SDL_min(texture->w - rect->x, rect->w); - r.h = SDL_min(texture->h - rect->y, rect->h); + real_rect.x = 0; + real_rect.y = 0; + real_rect.w = texture->w; + real_rect.h = texture->h; + + if (rect) { + SDL_IntersectRect(rect, &real_rect, &real_rect); } - ret = SDL_LockTexture(texture, &r, &pixels, &pitch); + ret = SDL_LockTexture(texture, &real_rect, &pixels, &pitch); if (ret < 0) { return ret; } - texture->locked_surface = SDL_CreateRGBSurfaceWithFormatFrom(pixels, r.w, r.h, 0, pitch, texture->format); + texture->locked_surface = SDL_CreateRGBSurfaceWithFormatFrom(pixels, real_rect.w, real_rect.h, 0, pitch, texture->format); if (texture->locked_surface == NULL) { SDL_UnlockTexture(texture); return -1;