Module: Mesa
Branch: master
Commit: e788b987d866c12af25cee641209a3a5b2d2c107
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e788b987d866c12af25cee641209a3a5b2d2c107

Author: Nicolai Hähnle <nicolai.haeh...@amd.com>
Date:   Tue Jan 16 14:38:00 2018 +0100

radeonsi: fix error paths of si_texture_transfer_map

trans is zero-initialized, but trans->resource is setup immediately so
needs to be dereferenced.

Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com>

---

 src/gallium/drivers/radeonsi/si_texture.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_texture.c 
b/src/gallium/drivers/radeonsi/si_texture.c
index b41a0d1b92..0a2939bdd1 100644
--- a/src/gallium/drivers/radeonsi/si_texture.c
+++ b/src/gallium/drivers/radeonsi/si_texture.c
@@ -1740,16 +1740,14 @@ static void *si_texture_transfer_map(struct 
pipe_context *ctx,
 
                        if (!si_init_flushed_depth_texture(ctx, &resource, 
&staging_depth)) {
                                PRINT_ERR("failed to create temporary texture 
to hold untiled copy\n");
-                               FREE(trans);
-                               return NULL;
+                               goto fail_trans;
                        }
 
                        if (usage & PIPE_TRANSFER_READ) {
                                struct pipe_resource *temp = 
ctx->screen->resource_create(ctx->screen, &resource);
                                if (!temp) {
                                        PRINT_ERR("failed to create a temporary 
depth texture\n");
-                                       FREE(trans);
-                                       return NULL;
+                                       goto fail_trans;
                                }
 
                                si_copy_region_with_blit(ctx, temp, 0, 0, 0, 0, 
texture, level, box);
@@ -1767,8 +1765,7 @@ static void *si_texture_transfer_map(struct pipe_context 
*ctx,
                        /* XXX: when discard is true, no need to read back from 
depth texture */
                        if (!si_init_flushed_depth_texture(ctx, texture, 
&staging_depth)) {
                                PRINT_ERR("failed to create temporary texture 
to hold untiled copy\n");
-                               FREE(trans);
-                               return NULL;
+                               goto fail_trans;
                        }
 
                        si_blit_decompress_depth(ctx, rtex, staging_depth,
@@ -1797,8 +1794,7 @@ static void *si_texture_transfer_map(struct pipe_context 
*ctx,
                staging = (struct 
r600_texture*)ctx->screen->resource_create(ctx->screen, &resource);
                if (!staging) {
                        PRINT_ERR("failed to create temporary texture to hold 
untiled copy\n");
-                       FREE(trans);
-                       return NULL;
+                       goto fail_trans;
                }
                trans->staging = &staging->resource;
 
@@ -1821,14 +1817,17 @@ static void *si_texture_transfer_map(struct 
pipe_context *ctx,
                buf = &rtex->resource;
        }
 
-       if (!(map = si_buffer_map_sync_with_rings(sctx, buf, usage))) {
-               r600_resource_reference(&trans->staging, NULL);
-               FREE(trans);
-               return NULL;
-       }
+       if (!(map = si_buffer_map_sync_with_rings(sctx, buf, usage)))
+               goto fail_trans;
 
        *ptransfer = &trans->b.b;
        return map + offset;
+
+fail_trans:
+       r600_resource_reference(&trans->staging, NULL);
+       pipe_resource_reference(&trans->b.b.resource, NULL);
+       FREE(trans);
+       return NULL;
 }
 
 static void si_texture_transfer_unmap(struct pipe_context *ctx,

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to