diff --git a/app/core/gimp-parasites.c b/app/core/gimp-parasites.c index ab1f4ccf6b..639bff6124 100644 --- a/app/core/gimp-parasites.c +++ b/app/core/gimp-parasites.c @@ -28,6 +28,18 @@ #include "gimpparasitelist.h" +gboolean +gimp_parasite_validate (Gimp *gimp, + const GimpParasite *parasite, + GError **error) +{ + g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE); + g_return_val_if_fail (parasite != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return TRUE; +} + void gimp_parasite_attach (Gimp *gimp, const GimpParasite *parasite) diff --git a/app/core/gimp-parasites.h b/app/core/gimp-parasites.h index 9607f4c13e..506aba69cb 100644 --- a/app/core/gimp-parasites.h +++ b/app/core/gimp-parasites.h @@ -20,6 +20,9 @@ /* some wrappers to access gimp->parasites, mainly for the PDB */ +gboolean gimp_parasite_validate (Gimp *gimp, + const GimpParasite *parasite, + GError **error); void gimp_parasite_attach (Gimp *gimp, const GimpParasite *parasite); void gimp_parasite_detach (Gimp *gimp, diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c index f18da62b3c..eebef2f930 100644 --- a/app/core/gimpimage.c +++ b/app/core/gimpimage.c @@ -3050,6 +3050,18 @@ gimp_image_parasite_list (const GimpImage *image, return list; } +gboolean +gimp_image_parasite_validate (GimpImage *image, + const GimpParasite *parasite, + GError **error) +{ + g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE); + g_return_val_if_fail (parasite != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return TRUE; +} + void gimp_image_parasite_attach (GimpImage *image, const GimpParasite *parasite) diff --git a/app/core/gimpimage.h b/app/core/gimpimage.h index 3cd6a1e00b..68c6edf3af 100644 --- a/app/core/gimpimage.h +++ b/app/core/gimpimage.h @@ -286,6 +286,9 @@ const GimpParasite * gimp_image_parasite_find (const GimpImage *image, const gchar *name); gchar ** gimp_image_parasite_list (const GimpImage *image, gint *count); +gboolean gimp_image_parasite_validate (GimpImage *image, + const GimpParasite *parasite, + GError **error); void gimp_image_parasite_attach (GimpImage *image, const GimpParasite *parasite); void gimp_image_parasite_detach (GimpImage *image, diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c index fb7701018e..649a23f4c9 100644 --- a/app/core/gimpitem.c +++ b/app/core/gimpitem.c @@ -1798,6 +1798,18 @@ gimp_item_get_parasites (const GimpItem *item) return GET_PRIVATE (item)->parasites; } +gboolean +gimp_item_parasite_validate (GimpItem *item, + const GimpParasite *parasite, + GError **error) +{ + g_return_val_if_fail (GIMP_IS_ITEM (item), FALSE); + g_return_val_if_fail (parasite != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return TRUE; +} + void gimp_item_parasite_attach (GimpItem *item, const GimpParasite *parasite, diff --git a/app/core/gimpitem.h b/app/core/gimpitem.h index 729136502d..a8ef1168c5 100644 --- a/app/core/gimpitem.h +++ b/app/core/gimpitem.h @@ -274,6 +274,9 @@ void gimp_item_set_parasites (GimpItem *item, GimpParasiteList *parasites); GimpParasiteList * gimp_item_get_parasites (const GimpItem *item); +gboolean gimp_item_parasite_validate (GimpItem *item, + const GimpParasite *parasite, + GError **error); void gimp_item_parasite_attach (GimpItem *item, const GimpParasite *parasite, gboolean push_undo); diff --git a/app/pdb/gimp-cmds.c b/app/pdb/gimp-cmds.c index a431520213..cc3cd8cdc1 100644 --- a/app/pdb/gimp-cmds.c +++ b/app/pdb/gimp-cmds.c @@ -114,7 +114,10 @@ attach_parasite_invoker (GimpProcedure *procedure, if (success) { - gimp_parasite_attach (gimp, parasite); + if (gimp_parasite_validate (gimp, parasite, error)) + gimp_parasite_attach (gimp, parasite); + else + success = FALSE; } return gimp_procedure_get_return_values (procedure, success, diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c index 7a74054873..f30a256436 100644 --- a/app/pdb/image-cmds.c +++ b/app/pdb/image-cmds.c @@ -2833,7 +2833,10 @@ image_attach_parasite_invoker (GimpProcedure *procedure, if (success) { - gimp_image_parasite_attach (image, parasite); + if (gimp_image_parasite_validate (image, parasite, error)) + gimp_image_parasite_attach (image, parasite); + else + success = FALSE; } return gimp_procedure_get_return_values (procedure, success, diff --git a/app/pdb/item-cmds.c b/app/pdb/item-cmds.c index 0addf698b1..61945933b2 100644 --- a/app/pdb/item-cmds.c +++ b/app/pdb/item-cmds.c @@ -785,7 +785,10 @@ item_attach_parasite_invoker (GimpProcedure *procedure, if (success) { - gimp_item_parasite_attach (item, parasite, TRUE); + if (gimp_item_parasite_validate (item, parasite, error)) + gimp_item_parasite_attach (item, parasite, TRUE); + else + success = FALSE; } return gimp_procedure_get_return_values (procedure, success, diff --git a/app/xcf/xcf-load.c b/app/xcf/xcf-load.c index a0476fad72..29aa33a166 100644 --- a/app/xcf/xcf-load.c +++ b/app/xcf/xcf-load.c @@ -753,12 +753,25 @@ xcf_load_image_props (XcfInfo *info, while (info->cp - base < prop_size) { - GimpParasite *p = xcf_load_parasite (info); + GimpParasite *p = xcf_load_parasite (info); + GError *error = NULL; if (! p) return FALSE; - gimp_image_parasite_attach (image, p); + if (! gimp_image_parasite_validate (image, p, &error)) + { + gimp_message (info->gimp, G_OBJECT (info->progress), + GIMP_MESSAGE_WARNING, + "Warning, invalid image parasite in XCF file: %s", + error->message); + g_clear_error (&error); + } + else + { + gimp_image_parasite_attach (image, p); + } + gimp_parasite_free (p); } @@ -1026,12 +1039,25 @@ xcf_load_layer_props (XcfInfo *info, while (info->cp - base < prop_size) { - GimpParasite *p = xcf_load_parasite (info); + GimpParasite *p = xcf_load_parasite (info); + GError *error = NULL; if (! p) return FALSE; - gimp_item_parasite_attach (GIMP_ITEM (*layer), p, FALSE); + if (! gimp_item_parasite_validate (GIMP_ITEM (*layer), p, &error)) + { + gimp_message (info->gimp, G_OBJECT (info->progress), + GIMP_MESSAGE_WARNING, + "Warning, invalid layer parasite in XCF file: %s", + error->message); + g_clear_error (&error); + } + else + { + gimp_item_parasite_attach (GIMP_ITEM (*layer), p, FALSE); + } + gimp_parasite_free (p); } @@ -1222,12 +1248,26 @@ xcf_load_channel_props (XcfInfo *info, while ((info->cp - base) < prop_size) { - GimpParasite *p = xcf_load_parasite (info); + GimpParasite *p = xcf_load_parasite (info); + GError *error = NULL; if (! p) return FALSE; - gimp_item_parasite_attach (GIMP_ITEM (*channel), p, FALSE); + if (! gimp_item_parasite_validate (GIMP_ITEM (*channel), p, + &error)) + { + gimp_message (info->gimp, G_OBJECT (info->progress), + GIMP_MESSAGE_WARNING, + "Warning, invalid channel parasite in XCF file: %s", + error->message); + g_clear_error (&error); + } + else + { + gimp_item_parasite_attach (GIMP_ITEM (*channel), p, FALSE); + } + gimp_parasite_free (p); } @@ -2148,11 +2188,24 @@ xcf_load_vector (XcfInfo *info, for (i = 0; i < num_parasites; i++) { GimpParasite *parasite = xcf_load_parasite (info); + GError *error = NULL; if (! parasite) return FALSE; - gimp_item_parasite_attach (GIMP_ITEM (vectors), parasite, FALSE); + if (! gimp_item_parasite_validate (GIMP_ITEM (vectors), parasite, &error)) + { + gimp_message (info->gimp, G_OBJECT (info->progress), + GIMP_MESSAGE_WARNING, + "Warning, invalid vectors parasite in XCF file: %s", + error->message); + g_clear_error (&error); + } + else + { + gimp_item_parasite_attach (GIMP_ITEM (vectors), parasite, FALSE); + } + gimp_parasite_free (parasite); } diff --git a/tools/pdbgen/pdb/gimp.pdb b/tools/pdbgen/pdb/gimp.pdb index 98d6f8f6da..0021161724 100644 --- a/tools/pdbgen/pdb/gimp.pdb +++ b/tools/pdbgen/pdb/gimp.pdb @@ -106,7 +106,10 @@ HELP %invoke = ( code => <<'CODE' { - gimp_parasite_attach (gimp, parasite); + if (gimp_parasite_validate (gimp, parasite, error)) + gimp_parasite_attach (gimp, parasite); + else + success = FALSE; } CODE ); diff --git a/tools/pdbgen/pdb/image.pdb b/tools/pdbgen/pdb/image.pdb index b6b8eaf664..a3f2b0a981 100644 --- a/tools/pdbgen/pdb/image.pdb +++ b/tools/pdbgen/pdb/image.pdb @@ -2862,7 +2862,10 @@ HELP %invoke = ( code => <<'CODE' { - gimp_image_parasite_attach (image, parasite); + if (gimp_image_parasite_validate (image, parasite, error)) + gimp_image_parasite_attach (image, parasite); + else + success = FALSE; } CODE ); diff --git a/tools/pdbgen/pdb/item.pdb b/tools/pdbgen/pdb/item.pdb index de868acaff..6d99a51600 100644 --- a/tools/pdbgen/pdb/item.pdb +++ b/tools/pdbgen/pdb/item.pdb @@ -753,7 +753,10 @@ HELP %invoke = ( code => <<'CODE' { - gimp_item_parasite_attach (item, parasite, TRUE); + if (gimp_item_parasite_validate (item, parasite, error)) + gimp_item_parasite_attach (item, parasite, TRUE); + else + success = FALSE; } CODE );