1
1
mirror of https://gitlab.gnome.org/GNOME/gimp.git synced 2025-10-05 21:02:42 +02:00

app, pdb: do not leak a GFile in gimp_temp_file() or any future…

… 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.
This commit is contained in:
Jehan
2025-09-24 02:18:24 +02:00
parent ba1de3b68e
commit b121ddd6f8
6 changed files with 25 additions and 9 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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
);

View File

@@ -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
);

View File

@@ -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',