From b121ddd6f87b1b2777bbecd662ef5982495895e7 Mon Sep 17 00:00:00 2001 From: Jehan Date: Wed, 24 Sep 2025 02:18:24 +0200 Subject: [PATCH] =?UTF-8?q?app,=20pdb:=20do=20not=20leak=20a=20GFile=20in?= =?UTF-8?q?=20gimp=5Ftemp=5Ffile()=20or=20any=20future=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … PDB API which will return a newly allocated GFile. Though gimp_temp_file() was so far the only such case where a returned GFile was being leaked, it may happen again. So the PDB must instead assume that all returned GFile-s have their own reference and take over said reference. And therefore update all other functions to increase the internal GFile-s reference counts. --- app/pdb/gimp-cmds.c | 2 +- app/pdb/image-cmds.c | 16 ++++++++++++---- app/pdb/link-layer-cmds.c | 4 ++-- pdb/groups/image.pdb | 8 ++++++++ pdb/groups/link_layer.pdb | 2 +- pdb/pdb.pl | 2 +- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/app/pdb/gimp-cmds.c b/app/pdb/gimp-cmds.c index 713f3f7ba6..1d09d3c024 100644 --- a/app/pdb/gimp-cmds.c +++ b/app/pdb/gimp-cmds.c @@ -223,7 +223,7 @@ temp_file_invoker (GimpProcedure *procedure, error ? *error : NULL); if (success) - g_value_set_object (gimp_value_array_index (return_vals, 1), file); + g_value_take_object (gimp_value_array_index (return_vals, 1), file); return return_vals; } diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c index eda00515b7..ab88ff77b0 100644 --- a/app/pdb/image-cmds.c +++ b/app/pdb/image-cmds.c @@ -2318,13 +2318,15 @@ image_get_file_invoker (GimpProcedure *procedure, if (success) { file = gimp_image_get_any_file (image); + if (file) + g_object_ref (file); } return_vals = gimp_procedure_get_return_values (procedure, success, error ? *error : NULL); if (success) - g_value_set_object (gimp_value_array_index (return_vals, 1), file); + g_value_take_object (gimp_value_array_index (return_vals, 1), file); return return_vals; } @@ -2396,13 +2398,15 @@ image_get_xcf_file_invoker (GimpProcedure *procedure, if (success) { file = gimp_image_get_file (image); + if (file) + g_object_ref (file); } return_vals = gimp_procedure_get_return_values (procedure, success, error ? *error : NULL); if (success) - g_value_set_object (gimp_value_array_index (return_vals, 1), file); + g_value_take_object (gimp_value_array_index (return_vals, 1), file); return return_vals; } @@ -2425,13 +2429,15 @@ image_get_imported_file_invoker (GimpProcedure *procedure, if (success) { file = gimp_image_get_imported_file (image); + if (file) + g_object_ref (file); } return_vals = gimp_procedure_get_return_values (procedure, success, error ? *error : NULL); if (success) - g_value_set_object (gimp_value_array_index (return_vals, 1), file); + g_value_take_object (gimp_value_array_index (return_vals, 1), file); return return_vals; } @@ -2454,13 +2460,15 @@ image_get_exported_file_invoker (GimpProcedure *procedure, if (success) { file = gimp_image_get_exported_file (image); + if (file) + g_object_ref (file); } return_vals = gimp_procedure_get_return_values (procedure, success, error ? *error : NULL); if (success) - g_value_set_object (gimp_value_array_index (return_vals, 1), file); + g_value_take_object (gimp_value_array_index (return_vals, 1), file); return return_vals; } diff --git a/app/pdb/link-layer-cmds.c b/app/pdb/link-layer-cmds.c index 8c1a65b4b4..235b35ee97 100644 --- a/app/pdb/link-layer-cmds.c +++ b/app/pdb/link-layer-cmds.c @@ -166,14 +166,14 @@ link_layer_get_file_invoker (GimpProcedure *procedure, if (success) { - file = gimp_link_get_file (gimp_link_layer_get_link (layer), NULL, NULL); + file = g_object_ref (gimp_link_get_file (gimp_link_layer_get_link (layer), NULL, NULL)); } return_vals = gimp_procedure_get_return_values (procedure, success, error ? *error : NULL); if (success) - g_value_set_object (gimp_value_array_index (return_vals, 1), file); + g_value_take_object (gimp_value_array_index (return_vals, 1), file); return return_vals; } diff --git a/pdb/groups/image.pdb b/pdb/groups/image.pdb index 339a859529..34f06484a8 100644 --- a/pdb/groups/image.pdb +++ b/pdb/groups/image.pdb @@ -2414,6 +2414,8 @@ HELP code => <<'CODE' { file = gimp_image_get_any_file (image); + if (file) + g_object_ref (file); } CODE ); @@ -2500,6 +2502,8 @@ HELP code => <<'CODE' { file = gimp_image_get_file (image); + if (file) + g_object_ref (file); } CODE ); @@ -2534,6 +2538,8 @@ HELP code => <<'CODE' { file = gimp_image_get_imported_file (image); + if (file) + g_object_ref (file); } CODE ); @@ -2567,6 +2573,8 @@ HELP code => <<'CODE' { file = gimp_image_get_exported_file (image); + if (file) + g_object_ref (file); } CODE ); diff --git a/pdb/groups/link_layer.pdb b/pdb/groups/link_layer.pdb index 6fde88cfc2..84b9936bf6 100644 --- a/pdb/groups/link_layer.pdb +++ b/pdb/groups/link_layer.pdb @@ -161,7 +161,7 @@ HELP %invoke = ( code => <<'CODE' { - file = gimp_link_get_file (gimp_link_layer_get_link (layer), NULL, NULL); + file = g_object_ref (gimp_link_get_file (gimp_link_layer_get_link (layer), NULL, NULL)); } CODE ); diff --git a/pdb/pdb.pl b/pdb/pdb.pl index a1a108cadb..2aeb5bbc8f 100644 --- a/pdb/pdb.pl +++ b/pdb/pdb.pl @@ -488,7 +488,7 @@ package Gimp::CodeGen::pdb; get_value_func => '$var = g_value_get_object ($value)', dup_value_func => '$var = GIMP_VALUES_DUP_FILE ($value)', set_value_func => 'g_value_set_object ($value, $var)', - take_value_func => 'g_value_set_object ($value, $var)' }, + take_value_func => 'g_value_take_object ($value, $var)' }, parasite => { name => 'PARASITE', gtype => 'GIMP_TYPE_PARASITE',