[PATCH vkd3d v3 5/8] vkd3d-shader/hlsl: Properly free parse_variable_def memory.

Francisco Casas fcasas at codeweavers.com
Wed Mar 2 12:31:45 CST 2022


Signed-off-by: Francisco Casas <fcasas at codeweavers.com>

---
v3:
- Simplified, only calling vkd3d_free(v->arrays.sizes) after the data
type is created.
- I also spotted some leaks in gen_struct_fields() and add_typedef() so
memory is also freed there.
- For that reason I had to move free_parse_variable_def() before these
functions.

Signed-off-by: Francisco Casas <fcasas at codeweavers.com>
---
 libs/vkd3d-shader/hlsl.y | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index 6a59134e..e702c234 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -668,6 +668,15 @@ static struct hlsl_type *apply_type_modifiers(struct hlsl_ctx *ctx, struct hlsl_
     return new_type;
 }
 
+static void free_parse_variable_def(struct parse_variable_def *v)
+{
+    free_parse_initializer(&v->initializer);
+    vkd3d_free(v->arrays.sizes);
+    vkd3d_free(v->name);
+    vkd3d_free((void *)v->semantic.name);
+    vkd3d_free(v);
+}
+
 static struct list *gen_struct_fields(struct hlsl_ctx *ctx, struct hlsl_type *type, struct list *fields)
 {
     struct parse_variable_def *v, *v_next;
@@ -685,13 +694,14 @@ static struct list *gen_struct_fields(struct hlsl_ctx *ctx, struct hlsl_type *ty
 
         if (!(field = hlsl_alloc(ctx, sizeof(*field))))
         {
-            vkd3d_free(v);
+            free_parse_variable_def(v);
             return list;
         }
 
         field->type = type;
         for (i = 0; i < v->arrays.count; ++i)
             field->type = hlsl_new_array_type(ctx, field->type, v->arrays.sizes[i]);
+        vkd3d_free(v->arrays.sizes);
         field->loc = v->loc;
         field->name = v->name;
         field->semantic = v->semantic;
@@ -719,7 +729,10 @@ static bool add_typedef(struct hlsl_ctx *ctx, DWORD modifiers, struct hlsl_type
         if (!v->arrays.count)
         {
             if (!(type = hlsl_type_clone(ctx, orig_type, 0, modifiers)))
+            {
+                free_parse_variable_def(v);
                 return false;
+            }
         }
         else
         {
@@ -729,8 +742,12 @@ static bool add_typedef(struct hlsl_ctx *ctx, DWORD modifiers, struct hlsl_type
         for (i = 0; i < v->arrays.count; ++i)
         {
             if (!(type = hlsl_new_array_type(ctx, type, v->arrays.sizes[i])))
+            {
+                free_parse_variable_def(v);
                 return false;
+            }
         }
+        vkd3d_free(v->arrays.sizes);
 
         vkd3d_free((void *)type->name);
         type->name = v->name;
@@ -747,6 +764,7 @@ static bool add_typedef(struct hlsl_ctx *ctx, DWORD modifiers, struct hlsl_type
         if (!ret)
             hlsl_error(ctx, &v->loc, VKD3D_SHADER_ERROR_HLSL_REDEFINED,
                     "Type '%s' is already defined.", v->name);
+        free_parse_initializer(&v->initializer);
         vkd3d_free(v);
     }
     vkd3d_free(list);
@@ -1369,15 +1387,6 @@ static void struct_var_initializer(struct hlsl_ctx *ctx, struct list *list, stru
     vkd3d_free(initializer->args);
 }
 
-static void free_parse_variable_def(struct parse_variable_def *v)
-{
-    free_parse_initializer(&v->initializer);
-    vkd3d_free(v->arrays.sizes);
-    vkd3d_free(v->name);
-    vkd3d_free((void *)v->semantic.name);
-    vkd3d_free(v);
-}
-
 static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_type,
         DWORD modifiers, struct list *var_list)
 {
@@ -1409,6 +1418,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
         type = basic_type;
         for (i = 0; i < v->arrays.count; ++i)
             type = hlsl_new_array_type(ctx, type, v->arrays.sizes[i]);
+        vkd3d_free(v->arrays.sizes);
 
         if (type->type != HLSL_CLASS_MATRIX)
             check_invalid_matrix_modifiers(ctx, modifiers, v->loc);
@@ -1468,6 +1478,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
             hlsl_error(ctx, &v->loc, VKD3D_SHADER_ERROR_HLSL_MISSING_INITIALIZER,
                     "Const variable \"%s\" is missing an initializer.", var->name);
             hlsl_free_var(var);
+            free_parse_initializer(&v->initializer);
             vkd3d_free(v);
             continue;
         }
@@ -1480,6 +1491,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
                     "Variable \"%s\" was already declared in this scope.", var->name);
             hlsl_note(ctx, &old->loc, VKD3D_SHADER_LOG_ERROR, "\"%s\" was previously declared here.", old->name);
             hlsl_free_var(var);
+            free_parse_initializer(&v->initializer);
             vkd3d_free(v);
             continue;
         }
-- 
2.25.1




More information about the wine-devel mailing list