From 14b2dc0013c73fbd47d232b2f3ff47d29f1f624c Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 11 Feb 2021 13:42:09 +1000 Subject: [PATCH] glsl: fix leak in gl_nir_link_uniform_blocks asan on llvmpipe with piglit tests/spec/arb_gl_spirv/execution/ssbo/array-indirect.shader_test reported. ================================================================= ==3288325==ERROR: LeakSanitizer: detected memory leaks Direct leak of 48 byte(s) in 1 object(s) allocated from: #0 0x7f5b2d6513cf in __interceptor_malloc (/lib64/libasan.so.6+0xab3cf) #1 0x7f5b2a1ae810 in ralloc_size ../src/util/ralloc.c:133 #2 0x7f5b2a1ae7e1 in ralloc_context ../src/util/ralloc.c:120 #3 0x7f5b2b210177 in gl_nir_link_uniform_blocks ../src/compiler/glsl/gl_nir_link_uniform_blocks.c:585 #4 0x7f5b2af7f52d in gl_nir_link_spirv ../src/compiler/glsl/gl_nir_linker.c:614 #5 0x7f5b2a3b76fa in st_link_nir ../src/mesa/state_tracker/st_glsl_to_nir.cpp:765 #6 0x7f5b2a3ace7b in st_link_shader ../src/mesa/state_tracker/st_glsl_to_ir.cpp:65 #7 0x7f5b2a471165 in _mesa_glsl_link_shader ../src/mesa/program/ir_to_mesa.cpp:3122 #8 0x7f5b2a97a6d8 in link_program ../src/mesa/main/shaderapi.c:1311 #9 0x7f5b2a97a6d8 in link_program_error ../src/mesa/main/shaderapi.c:1419 #10 0x7f5b2a97df45 in _mesa_LinkProgram ../src/mesa/main/shaderapi.c:1911 #11 0x7f5b299b59e5 in stub_glLinkProgram /mnt/devel/gl/piglit/tests/util/piglit-dispatch-gen.c:33956 #12 0x40a71a in link_and_use_shaders /mnt/devel/gl/piglit/tests/shaders/shader_runner.c:1604 #13 0x415722 in init_test /mnt/devel/gl/piglit/tests/shaders/shader_runner.c:5225 #14 0x4164ce in piglit_init /mnt/devel/gl/piglit/tests/shaders/shader_runner.c:5597 #15 0x7f5b29a214e9 in run_test /mnt/devel/gl/piglit/tests/util/piglit-framework-gl/piglit_winsys_framework.c:73 #16 0x7f5b29a103fe in piglit_gl_test_run /mnt/devel/gl/piglit/tests/util/piglit-framework-gl.c:229 #17 0x407847 in main /mnt/devel/gl/piglit/tests/shaders/shader_runner.c:72 #18 0x7f5b2928f1e1 in __libc_start_main (/lib64/libc.so.6+0x281e1) SUMMARY: AddressSanitizer: 48 byte(s) leaked in 1 allocation(s). Fixes: 57239192 ("nir/linker: add gl_nir_link_uniform_blocks.c") Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- src/compiler/glsl/gl_nir_link_uniform_blocks.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/compiler/glsl/gl_nir_link_uniform_blocks.c b/src/compiler/glsl/gl_nir_link_uniform_blocks.c index 1a7fdf35fd2..9c95918287b 100644 --- a/src/compiler/glsl/gl_nir_link_uniform_blocks.c +++ b/src/compiler/glsl/gl_nir_link_uniform_blocks.c @@ -583,7 +583,7 @@ gl_nir_link_uniform_blocks(struct gl_context *ctx, struct gl_shader_program *prog) { void *mem_ctx = ralloc_context(NULL); - + bool ret = false; for (int stage = 0; stage < MESA_SHADER_STAGES; stage++) { struct gl_linked_shader *const linked = prog->_LinkedShaders[stage]; struct gl_uniform_block *ubo_blocks = NULL; @@ -603,7 +603,7 @@ gl_nir_link_uniform_blocks(struct gl_context *ctx, BLOCK_SSBO); if (!prog->data->LinkStatus) { - return false; + goto out; } prog->data->linked_stages |= 1 << stage; @@ -638,10 +638,13 @@ gl_nir_link_uniform_blocks(struct gl_context *ctx, } if (!nir_interstage_cross_validate_uniform_blocks(prog, BLOCK_UBO)) - return false; + goto out; if (!nir_interstage_cross_validate_uniform_blocks(prog, BLOCK_SSBO)) - return false; + goto out; - return true; + ret = true; +out: + ralloc_free(mem_ctx); + return ret; }