[Mesa-dev] [PATCH] mesa: improve free() cleanup in generate_mipmap_compressed()
Brian Paul
brianp at vmware.com
Wed Jul 31 05:56:59 PDT 2013
On 07/31/2013 01:50 AM, Vinson Lee wrote:
> 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
We're doing that. The line is questions just isn't visible in the above
patch.
-Brian
More information about the mesa-dev
mailing list