[gimp] Bug 711241 - Broken or unknown metadata tag should not cancel...



commit 798c62a54486916c69141463980a4497aea14b98
Author: Michael Natterer <mitch gimp org>
Date:   Fri Nov 1 14:15:15 2013 +0100

    Bug 711241 - Broken or unknown metadata tag should not cancel...
    
    ...the whole metadata loading
    
    Don't serialize a value that does not UTF-8-validate to XML. This is
    not a real fix, but no matter what we do here in the future, UTF-8
    validation should always be part of the serialization, in order to
    avoid passing broken data into the core.

 libgimpbase/gimpmetadata.c |   61 ++++++++++++++++++++++++++++---------------
 1 files changed, 40 insertions(+), 21 deletions(-)
---
diff --git a/libgimpbase/gimpmetadata.c b/libgimpbase/gimpmetadata.c
index 4cf4a70..fc10e59 100644
--- a/libgimpbase/gimpmetadata.c
+++ b/libgimpbase/gimpmetadata.c
@@ -346,6 +346,19 @@ gimp_metadata_deserialize (const gchar *metadata_xml)
   return metadata;
 }
 
+static gchar *
+gimp_metadata_escape (const gchar *name,
+                      const gchar *value)
+{
+  if (! g_utf8_validate (value, -1, NULL))
+    {
+      g_printerr ("Invalid UTF-8 in metadata value %s: %s\n", name, value);
+      return NULL;
+    }
+
+  return g_markup_escape_text (value, -1);
+}
+
 /**
  * gimp_metadata_serialize:
  * @metadata: A #GimpMetadata instance.
@@ -381,14 +394,16 @@ gimp_metadata_serialize (GimpMetadata *metadata)
     {
       for (i = 0; exif_data[i] != NULL; i++)
         {
-          value   = gexiv2_metadata_get_tag_string (metadata, exif_data[i]);
-          escaped = g_markup_escape_text (value, -1);
-
-          g_string_append_printf (string, "  <tag name=\"%s\">%s</tag>\n",
-                                  exif_data[i], escaped);
-
-          g_free (escaped);
+          value = gexiv2_metadata_get_tag_string (metadata, exif_data[i]);
+          escaped = gimp_metadata_escape (exif_data[i], value);
           g_free (value);
+
+          if (escaped)
+            {
+              g_string_append_printf (string, "  <tag name=\"%s\">%s</tag>\n",
+                                      exif_data[i], escaped);
+              g_free (escaped);
+            }
         }
 
       g_strfreev (exif_data);
@@ -400,14 +415,16 @@ gimp_metadata_serialize (GimpMetadata *metadata)
     {
       for (i = 0; xmp_data[i] != NULL; i++)
         {
-          value   = gexiv2_metadata_get_tag_string (metadata, xmp_data[i]);
-          escaped = g_markup_escape_text (value, -1);
-
-          g_string_append_printf (string, "  <tag name=\"%s\">%s</tag>\n",
-                                  xmp_data[i], escaped);
-
-          g_free (escaped);
+          value = gexiv2_metadata_get_tag_string (metadata, xmp_data[i]);
+          escaped = gimp_metadata_escape (xmp_data[i], value);
           g_free (value);
+
+          if (escaped)
+            {
+              g_string_append_printf (string, "  <tag name=\"%s\">%s</tag>\n",
+                                      xmp_data[i], escaped);
+              g_free (escaped);
+            }
         }
 
       g_strfreev (xmp_data);
@@ -419,14 +436,16 @@ gimp_metadata_serialize (GimpMetadata *metadata)
     {
       for (i = 0; iptc_data[i] != NULL; i++)
         {
-          value   = gexiv2_metadata_get_tag_string (metadata, iptc_data[i]);
-          escaped = g_markup_escape_text (value, -1);
-
-          g_string_append_printf (string, "  <tag name=\"%s\">%s</tag>\n",
-                                  iptc_data[i], escaped);
-
-          g_free (escaped);
+          value = gexiv2_metadata_get_tag_string (metadata, iptc_data[i]);
+          escaped = gimp_metadata_escape (iptc_data[i], value);
           g_free (value);
+
+          if (escaped)
+            {
+              g_string_append_printf (string, "  <tag name=\"%s\">%s</tag>\n",
+                                      iptc_data[i], escaped);
+              g_free (escaped);
+            }
         }
 
       g_strfreev (iptc_data);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]