[gimp] app, libgimp: add _gimp_gp_params_free() to gimpgpparams



commit bfe4a2f9dd59a7e2b946954bf3dec28f4346c24b
Author: Michael Natterer <mitch gimp org>
Date:   Thu Sep 5 20:59:57 2019 +0200

    app, libgimp: add _gimp_gp_params_free() to gimpgpparams
    
    which frees exactly what _gimp_value_array_to_gp_params() has
    allocated, honors its "full_copy" parameter, and plugs the last
    libgimp refactoring leaks I'm currently aware of.

 app/plug-in/gimpplugin-message.c     |  3 +-
 app/plug-in/gimppluginmanager-call.c | 13 +++----
 libgimp/gimpgpparams-body.c          | 70 +++++++++++++++++++++++++++++++++++-
 libgimp/gimpgpparams.h               |  3 ++
 libgimp/gimppdb.c                    |  3 +-
 libgimp/gimpplugin.c                 |  6 ++--
 6 files changed, 81 insertions(+), 17 deletions(-)
---
diff --git a/app/plug-in/gimpplugin-message.c b/app/plug-in/gimpplugin-message.c
index 607a79948b..74027da4c4 100644
--- a/app/plug-in/gimpplugin-message.c
+++ b/app/plug-in/gimpplugin-message.c
@@ -624,8 +624,7 @@ gimp_plug_in_handle_proc_run (GimpPlugIn *plug_in,
           gimp_plug_in_close (plug_in, TRUE);
         }
 
-      /* FIXME leaking object arrays */
-      g_free (proc_return.params);
+      _gimp_gp_params_free (proc_return.params, proc_return.nparams, FALSE);
     }
 
   gimp_value_array_unref (return_vals);
diff --git a/app/plug-in/gimppluginmanager-call.c b/app/plug-in/gimppluginmanager-call.c
index a405da1538..af433312b9 100644
--- a/app/plug-in/gimppluginmanager-call.c
+++ b/app/plug-in/gimppluginmanager-call.c
@@ -246,8 +246,7 @@ gimp_plug_in_manager_call_run (GimpPlugInManager   *manager,
           g_free (config.display_name);
           g_free (config.icon_theme_dir);
 
-          /* FIXME leaking object arrays */
-          g_free (proc_run.params);
+          _gimp_gp_params_free (proc_run.params, proc_run.nparams, FALSE);
 
           g_object_unref (plug_in);
 
@@ -261,8 +260,7 @@ gimp_plug_in_manager_call_run (GimpPlugInManager   *manager,
       g_free (config.display_name);
       g_free (config.icon_theme_dir);
 
-      /* FIXME leaking object arrays */
-      g_free (proc_run.params);
+      _gimp_gp_params_free (proc_run.params, proc_run.nparams, FALSE);
 
       /* If this is an extension,
        * wait for an installation-confirmation message
@@ -341,8 +339,8 @@ gimp_plug_in_manager_call_run_temp (GimpPlugInManager      *manager,
                                             _("Failed to run plug-in \"%s\""),
                                             name);
 
-          /* FIXME leaking object arrays */
-          g_free (proc_run.params);
+
+          _gimp_gp_params_free (proc_run.params, proc_run.nparams, FALSE);
           gimp_plug_in_proc_frame_pop (plug_in);
 
           return_vals = gimp_procedure_get_return_values (GIMP_PROCEDURE (procedure),
@@ -354,8 +352,7 @@ gimp_plug_in_manager_call_run_temp (GimpPlugInManager      *manager,
 
       gimp_allow_set_foreground_window (plug_in);
 
-      /* FIXME leaking object arrays */
-      g_free (proc_run.params);
+      _gimp_gp_params_free (proc_run.params, proc_run.nparams, FALSE);
 
       g_object_ref (plug_in);
       gimp_plug_in_proc_frame_ref (proc_frame);
diff --git a/libgimp/gimpgpparams-body.c b/libgimp/gimpgpparams-body.c
index 452f0c06da..1556138019 100644
--- a/libgimp/gimpgpparams-body.c
+++ b/libgimp/gimpgpparams-body.c
@@ -835,7 +835,7 @@ gimp_value_to_gp_param (const GValue *value,
 
           param->data.d_id_array.size = array->length;
 
-          /* FIXME LEAK */
+          /* must be free'd also for full_copy == FALSE */
           param->data.d_id_array.data = g_new (gint32, array->length);
 
           for (i = 0; i < array->length; i++)
@@ -926,3 +926,71 @@ _gimp_value_array_to_gp_params (const GimpValueArray  *args,
 
   return params;
 }
+
+void
+_gimp_gp_params_free (GPParam  *params,
+                      gint      n_params,
+                      gboolean  full_copy)
+{
+  gint i;
+
+  for (i = 0; i < n_params; i++)
+    {
+      if (full_copy)
+        g_free (params[i].type_name);
+
+      switch (params[i].param_type)
+        {
+        case GP_PARAM_TYPE_INT:
+        case GP_PARAM_TYPE_FLOAT:
+          break;
+
+        case GP_PARAM_TYPE_STRING:
+          if (full_copy)
+            g_free (params[i].data.d_string);
+          break;
+
+        case GP_PARAM_TYPE_COLOR:
+          break;
+
+        case GP_PARAM_TYPE_ARRAY:
+          if (full_copy)
+            g_free (params[i].data.d_array.data);
+          break;
+
+        case GP_PARAM_TYPE_STRING_ARRAY:
+          if (full_copy                              &&
+              params[i].data.d_string_array.size > 0 &&
+              params[i].data.d_string_array.data)
+            {
+              gint j;
+
+              for (j = 0; j < params[i].data.d_string_array.size; j++)
+                g_free (params[i].data.d_string_array.data[j]);
+
+              g_free (params[i].data.d_string_array.data);
+            }
+          break;
+
+        case GP_PARAM_TYPE_ID_ARRAY:
+          if (full_copy)
+            g_free (params[i].data.d_id_array.type_name);
+
+          /* always free the array */
+          g_free (params[i].data.d_id_array.data);
+          break;
+
+        case GP_PARAM_TYPE_PARASITE:
+          if (full_copy)
+            g_free (params[i].data.d_parasite.name);
+          if (params[i].data.d_parasite.data)
+            g_free (params[i].data.d_parasite.data);
+          break;
+
+        case GP_PARAM_TYPE_PARAM_DEF:
+          break;
+        }
+    }
+
+  g_free (params);
+}
diff --git a/libgimp/gimpgpparams.h b/libgimp/gimpgpparams.h
index 265720539c..8f88080068 100644
--- a/libgimp/gimpgpparams.h
+++ b/libgimp/gimpgpparams.h
@@ -37,6 +37,9 @@ GimpValueArray * _gimp_gp_params_to_value_array   (gpointer              gimp,
                                                    gboolean              return_values);
 GPParam        * _gimp_value_array_to_gp_params   (const GimpValueArray *args,
                                                    gboolean              full_copy);
+void             _gimp_gp_params_free             (GPParam              *params,
+                                                   gint                  n_params,
+                                                   gboolean              full_copy);
 
 
 G_END_DECLS
diff --git a/libgimp/gimppdb.c b/libgimp/gimppdb.c
index 3f67637e46..30ee80313a 100644
--- a/libgimp/gimppdb.c
+++ b/libgimp/gimppdb.c
@@ -302,8 +302,7 @@ gimp_pdb_run_procedure_array (GimpPDB              *pdb,
                            &proc_run, pdb->priv->plug_in))
     gimp_quit ();
 
-  /* FIXME leaking object arrays */
-  g_free (proc_run.params);
+  _gimp_gp_params_free (proc_run.params, proc_run.nparams, FALSE);
 
   _gimp_plug_in_read_expect_msg (pdb->priv->plug_in, &msg, GP_PROC_RETURN);
 
diff --git a/libgimp/gimpplugin.c b/libgimp/gimpplugin.c
index 81b1232b5f..32c2a0d019 100644
--- a/libgimp/gimpplugin.c
+++ b/libgimp/gimpplugin.c
@@ -1127,8 +1127,7 @@ gimp_plug_in_proc_run (GimpPlugIn *plug_in,
                               &proc_return, plug_in))
     gimp_quit ();
 
-  /* FIXME leaking object arrays */
-  g_free (proc_return.params);
+  _gimp_gp_params_free (proc_return.params, proc_return.nparams, TRUE);
 }
 
 static void
@@ -1151,8 +1150,7 @@ gimp_plug_in_temp_proc_run (GimpPlugIn *plug_in,
                                    &proc_return, plug_in))
     gimp_quit ();
 
-  /* FIXME leaking object arrays */
-  g_free (proc_return.params);
+  _gimp_gp_params_free (proc_return.params, proc_return.nparams, TRUE);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]