Commit 7d47f526a7630e9c03ce29bb48c9b98e9dddf742

Sylvain Becker 2019-10-01T09:26:30

SDL_LockTextureToSurface: robustness of locked region compared to texture size

diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index 2ea2504..fb770d4 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;