glsl: Fix blob memory leak
authorBartosz Tomczyk <bartosz.tomczyk86@gmail.com>
Mon, 3 Apr 2017 17:39:19 +0000 (19:39 +0200)
committerTimothy Arceri <tarceri@itsqueeze.com>
Mon, 3 Apr 2017 23:22:29 +0000 (09:22 +1000)
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/blob.h
src/compiler/glsl/shader_cache.cpp
src/compiler/glsl/tests/blob_test.c
src/mesa/state_tracker/st_shader_cache.c

index 9de12e6eb82c13454d13a37b61b2fed816bbef28..940c81e13b4732d1785b13df31143389531c138d 100644 (file)
@@ -27,6 +27,7 @@
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
+#include <stdlib.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -79,6 +80,16 @@ struct blob_reader {
 struct blob *
 blob_create(void);
 
+/**
+ * Destroy a blob and free its memory.
+ */
+static inline void
+blob_destroy(struct blob *blob)
+{
+   free(blob->data);
+   free(blob);
+}
+
 /**
  * Add some unstructured, fixed-size data to a blob.
  *
index ea1bc01f0285c8c335bf1a8846466bdeab9ce442..f5e6a22bb9e996733e1d906af8a64d1a3c637300 100644 (file)
@@ -1273,7 +1273,7 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
 
    disk_cache_put(cache, prog->data->sha1, metadata->data, metadata->size);
 
-   free(metadata);
+   blob_destroy(metadata);
 
    if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
       _mesa_sha1_format(sha1_buf, prog->data->sha1);
index 01b5ef0b2f074cec09608da8797b3a2ae685269f..df0e91af353407808e85b62c32f067e29d68a4f2 100644 (file)
@@ -184,7 +184,7 @@ test_write_and_read_functions (void)
                 "read_consumes_all_bytes");
    expect_equal(false, reader.overrun, "read_does_not_overrun");
 
-   free(blob);
+   blob_destroy(blob);
 }
 
 /* Test that data values are written and read with proper alignment. */
@@ -242,7 +242,7 @@ test_alignment(void)
                    "aligned read of intptr_t");
    }
 
-   free(blob);
+   blob_destroy(blob);
 }
 
 /* Test that we detect overrun. */
@@ -264,7 +264,7 @@ test_overrun(void)
    expect_equal(0, blob_read_uint32(&reader), "read at overrun");
    expect_equal(true, reader.overrun, "overrun flag set");
 
-   free(blob);
+   blob_destroy(blob);
 }
 
 /* Test that we can read and write some large objects, (exercising the code in
@@ -308,7 +308,7 @@ test_big_objects(void)
    expect_equal(false, reader.overrun,
                 "overrun flag not set reading large objects");
 
-   free(blob);
+   blob_destroy(blob);
    ralloc_free(ctx);
 }
 
index e8c7289ec6dc6c9c91f227a296ee2d2ca46c8fce..1a11f1135d7873cc63fce9b8d5016aa9537841d5 100644 (file)
@@ -135,7 +135,7 @@ st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program *prog,
               _mesa_shader_stage_to_string(prog->info.stage), sha1_buf);
    }
 
-   free(blob);
+   blob_destroy(blob);
 }
 
 static void