summaryrefslogtreecommitdiffstats
path: root/graphics/gpaint/patches/24_fix_crash_on_failed_write.patch
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/gpaint/patches/24_fix_crash_on_failed_write.patch')
-rw-r--r--graphics/gpaint/patches/24_fix_crash_on_failed_write.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/graphics/gpaint/patches/24_fix_crash_on_failed_write.patch b/graphics/gpaint/patches/24_fix_crash_on_failed_write.patch
new file mode 100644
index 0000000000..92be4e8020
--- /dev/null
+++ b/graphics/gpaint/patches/24_fix_crash_on_failed_write.patch
@@ -0,0 +1,105 @@
+Author: Goedson Teixeira Paixao <goedson@debian.org>
+Description: Fix crash when saving in unsupported format
+ Check if the format chosen by the user is supported before trying to save.
+Bug-Ubuntu: https://bugs.edge.launchpad.net/ubuntu/+source/gpaint/+bug/386234
+Bug: https://savannah.gnu.org/bugs/?25334
+Forwarded: https://savannah.gnu.org/patch/?7052
+
+Index: b/src/drawing.c
+===================================================================
+--- a/src/drawing.c 2009-12-19 17:12:11.000000000 -0200
++++ b/src/drawing.c 2009-12-19 17:12:12.000000000 -0200
+@@ -262,7 +262,7 @@
+ (error && error->message) ? error->message : "");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(GTK_WIDGET(dialog));
+- g_free(error); /* allocated by gdk-pixbuf library */
++ g_error_free(error); /* allocated by gdk-pixbuf library */
+ }
+ return saved;
+ }
+Index: b/src/image.c
+===================================================================
+--- a/src/image.c 2009-12-19 17:12:11.000000000 -0200
++++ b/src/image.c 2009-12-19 17:12:12.000000000 -0200
+@@ -32,6 +32,7 @@
+ #include <gdk/gdkx.h> /* for gdk_root_parent */
+ #include <gdk-pixbuf/gdk-pixbuf.h>
+
++#define _(String) gettext (String)
+
+ static int cmp_int(const void *a, const void *b);
+ static void fill_polygon(
+@@ -191,13 +192,48 @@
+ return image;
+ }
+
++
++gboolean
++is_writable (GSList *formats, gchar *type)
++{
++ gboolean writable = FALSE;
++
++ while (!writable && formats != NULL)
++ {
++ gchar** extensions = gdk_pixbuf_format_get_extensions((GdkPixbufFormat *)(formats->data));
++ gchar** e = NULL;
++ for (e = extensions; *e; ++e)
++ {
++ if (!strcmp(*e, type))
++ {
++ writable = TRUE;
++ break;
++ }
++ }
++ g_strfreev (extensions);
++ formats = g_slist_next (formats);
++ }
++ return writable;
++}
++
++void add_if_writable (GdkPixbufFormat *data, GSList **list)
++{
++ if (gdk_pixbuf_format_is_writable (data))
++ *list = g_slist_prepend (*list, data);
++}
++
+ int
+ image_write(gpaint_image* image, const gchar* filename, GError **perror)
+ {
+ gboolean saved = FALSE;
+ gchar *ext = NULL;
+ gchar *type = NULL;
+-
++
++ GSList *formats = gdk_pixbuf_get_formats ();
++ GSList *writable_formats = NULL;
++ g_slist_foreach (formats, add_if_writable, &writable_formats);
++ g_slist_free (formats);
++
+ ext = g_strrstr(filename, ".");
+ if (!ext)
+ {
+@@ -214,13 +250,20 @@
+ {
+ type = g_ascii_strdown(ext+1,-1);
+ debug1("type=[%s]",type);
+- saved = gdk_pixbuf_save(image->pixbuf, filename, type, perror, NULL);
++ if (is_writable (writable_formats, type))
++ {
++ saved = gdk_pixbuf_save(image->pixbuf, filename, type, perror, NULL);
++ } else {
++ saved = FALSE;
++ *perror = g_error_new (GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_BAD_OPTION, _("Saving in the '%s' format is not supported by gdk_pixbuf"), type);
++ }
+ g_free(type);
+ }
+ if (!saved && *perror)
+ {
+ g_warning("Could not save image %s: %s\n", filename, (*perror)->message);
+- }
++ }
++ g_slist_free (writable_formats);
+ return saved;
+ }
+