r600g: Don't leak bytecode on shader compile failure
authorMichel Dänzer <michel.daenzer@amd.com>
Wed, 9 Apr 2014 06:38:21 +0000 (15:38 +0900)
committerMichel Dänzer <michel@daenzer.net>
Thu, 10 Apr 2014 05:00:43 +0000 (14:00 +0900)
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=74868

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/r600/r600_shader.c

index ddf79ee..b4b357e 100644 (file)
@@ -155,7 +155,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
        r = r600_shader_from_tgsi(rctx, shader, key);
        if (r) {
                R600_ERR("translation from TGSI failed !\n");
-               return r;
+               goto error;
        }
 
        /* disable SB for geom shaders - it can't handle the CF_EMIT instructions */
@@ -169,7 +169,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
                r = r600_bytecode_build(&shader->shader.bc);
                if (r) {
                        R600_ERR("building bytecode failed !\n");
-                       return r;
+                       goto error;
                }
        }
 
@@ -182,7 +182,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
                                             dump, use_sb);
                if (r) {
                        R600_ERR("r600_sb_bytecode_process failed !\n");
-                       return r;
+                       goto error;
                }
        }
 
@@ -192,16 +192,16 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
                        r = r600_sb_bytecode_process(rctx, &shader->gs_copy_shader->shader.bc,
                                                     &shader->gs_copy_shader->shader, dump, 0);
                        if (r)
-                               return r;
+                               goto error;
                }
 
                if ((r = store_shader(ctx, shader->gs_copy_shader)))
-                       return r;
+                       goto error;
        }
 
        /* Store the shader in a buffer. */
        if ((r = store_shader(ctx, shader)))
-               return r;
+               goto error;
 
        /* Build state. */
        switch (shader->shader.processor_type) {
@@ -235,9 +235,14 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
                }
                break;
        default:
-               return -EINVAL;
+               r = -EINVAL;
+               goto error;
        }
        return 0;
+
+error:
+       r600_pipe_shader_destroy(ctx, shader);
+       return r;
 }
 
 void r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)