[Mesa-dev] [PATCH] mesa: improve free() cleanup in generate_mipmap_compressed()

Vinson Lee vlee at freedesktop.org
Wed Jul 31 00:50:47 PDT 2013


On Fri, Jul 26, 2013 at 8:54 AM, Brian Paul <brianp at vmware.com> wrote:
> Free all our temporary buffers in one place at the end of the
> function.  Fixes memory leak detected by Coverity.
>
> Note: This is a candidate for the 9.x branches
> Cc: mesa-stable at lists.freedesktop.org
> ---
>  src/mesa/main/mipmap.c |   17 +++++++----------
>  1 file changed, 7 insertions(+), 10 deletions(-)
>
> diff --git a/src/mesa/main/mipmap.c b/src/mesa/main/mipmap.c
> index 5839632..180f891 100644
> --- a/src/mesa/main/mipmap.c
> +++ b/src/mesa/main/mipmap.c
> @@ -2024,7 +2024,7 @@ generate_mipmap_compressed(struct gl_context *ctx, GLenum target,
>     GLubyte *temp_src = NULL, *temp_dst = NULL;
>     GLenum temp_datatype;
>     GLenum temp_base_format;
> -   GLubyte **temp_src_slices, **temp_dst_slices;
> +   GLubyte **temp_src_slices = NULL, **temp_dst_slices = NULL;
>
>     /* only two types of compressed textures at this time */
>     assert(texObj->Target == GL_TEXTURE_2D ||
> @@ -2063,11 +2063,8 @@ generate_mipmap_compressed(struct gl_context *ctx, GLenum target,
>     temp_dst_slices = malloc(srcImage->Depth * sizeof(GLubyte *));
>
>     if (!temp_src || !temp_src_slices || !temp_dst_slices) {
> -      free(temp_src);
> -      free(temp_src_slices);
> -      free(temp_dst_slices);
>        _mesa_error(ctx, GL_OUT_OF_MEMORY, "generate mipmaps");
> -      return;
> +      goto end;
>     }
>
>     /* decompress base image to the temporary src buffer */
> @@ -2119,7 +2116,7 @@ generate_mipmap_compressed(struct gl_context *ctx, GLenum target,
>          temp_dst = malloc(temp_dst_img_stride * dstDepth);
>          if (!temp_dst) {
>             _mesa_error(ctx, GL_OUT_OF_MEMORY, "generate mipmaps");
> -           break;
> +            goto end;
>          }
>        }
>
> @@ -2127,8 +2124,7 @@ generate_mipmap_compressed(struct gl_context *ctx, GLenum target,
>        dstImage = _mesa_get_tex_image(ctx, texObj, target, level + 1);
>        if (!dstImage) {
>           _mesa_error(ctx, GL_OUT_OF_MEMORY, "generating mipmaps");
> -         free(temp_dst);
> -         return;
> +         goto end;
>        }
>
>        /* for 2D arrays, setup array[depth] of slice pointers */
> @@ -2153,8 +2149,8 @@ generate_mipmap_compressed(struct gl_context *ctx, GLenum target,
>                                        dstWidth, dstHeight, dstDepth,
>                                        border, srcImage->InternalFormat,
>                                        srcImage->TexFormat)) {
> -         free(temp_dst);
> -         return;
> +         /* all done */
> +         goto end;
>        }
>
>        /* The image space was allocated above so use glTexSubImage now */
> @@ -2173,6 +2169,7 @@ generate_mipmap_compressed(struct gl_context *ctx, GLenum target,
>        }
>     } /* loop over mipmap levels */
>
> +end:
>     free(temp_src);
>     free(temp_dst);
>     free(temp_src_slices);
> --
> 1.7.10.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Need to free temp_dst_slices as well.


More information about the mesa-dev mailing list