Module: Mesa
Branch: staging/23.0
Commit: d4b5259ac3990053eeff5f36187c326e05f37cb8
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=d4b5259ac3990053eeff5f36187c326e05f37cb8

Author: Patrick Lerda <[email protected]>
Date:   Sat Mar 25 02:14:32 2023 +0100

r600/sfn: fix memory leak related to sh_info->arrays

For instance, with "piglit/bin/shader_runner 
tests/spec/glsl-1.10/execution/glsl-vs-arrays-2.shader_test -auto -fbo":
Direct leak of 12 byte(s) in 1 object(s) allocated from:
    #0 0x7f33c3f3d097 in operator new[](unsigned long) 
(/usr/lib64/libasan.so.6+0xb3097)
    #1 0x7f33b9af1e5b in r600::ValueFactory::get_shader_info(r600_shader*) 
../src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp:1056
    #2 0x7f33b9a96860 in r600::Shader::get_shader_info(r600_shader*) 
../src/gallium/drivers/r600/sfn/sfn_shader.cpp:1445
    #3 0x7f33b99ddd07 in r600_shader_from_nir 
../src/gallium/drivers/r600/sfn/sfn_nir.cpp:1032
    #4 0x7f33b9c3e701 in r600_pipe_shader_create 
../src/gallium/drivers/r600/r600_shader.c:231

Fixes: 79ca456b4837 ("r600/sfn: rewrite NIR backend")
Signed-off-by: Patrick Lerda <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22262>
(cherry picked from commit e45fa939b09049cc6d6a55d637ca0139633c76fc)

---

 .pick_status.json                                 | 2 +-
 src/gallium/drivers/r600/r600_shader.c            | 3 +++
 src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp | 3 ++-
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index d30d80880a5..94b81e20f0e 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -2294,7 +2294,7 @@
         "description": "r600/sfn: fix memory leak related to sh_info->arrays",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "79ca456b4837b3bc21cf9ef3c03c505c4b4909f6",
         "notes": null
diff --git a/src/gallium/drivers/r600/r600_shader.c 
b/src/gallium/drivers/r600/r600_shader.c
index ceec7c747af..546687d19b9 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -420,6 +420,9 @@ void r600_pipe_shader_destroy(struct pipe_context *ctx 
UNUSED, struct r600_pipe_
        if (list_is_linked(&shader->shader.bc.cf))
                r600_bytecode_clear(&shader->shader.bc);
        r600_release_command_buffer(&shader->command_buffer);
+
+       if (shader->shader.arrays)
+               free(shader->shader.arrays);
 }
 
 /*
diff --git a/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp 
b/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp
index 4c9a822e52c..44248cd9bdf 100644
--- a/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp
@@ -1053,7 +1053,8 @@ ValueFactory::get_shader_info(r600_shader *sh_info)
    if (!arrays.empty()) {
 
       sh_info->num_arrays = arrays.size();
-      sh_info->arrays = new r600_shader_array[arrays.size()];
+      sh_info->arrays =
+         (r600_shader_array *)malloc(sizeof(struct r600_shader_array) * 
arrays.size());
 
       for (auto& arr : arrays) {
          sh_info->arrays->gpr_start = arr->sel();

Reply via email to