From bfe4a2f9dd59a7e2b946954bf3dec28f4346c24b Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Thu, 5 Sep 2019 20:59:57 +0200 Subject: [PATCH] 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