Control: tag -1 patch

Hi,

Attached CVE-2013-1881* patches apply to librsvg in squeeze, with only
a partial origin policy (it ignores the location in the local fs).
Upstream's librsvg patches apply clean to the version in wheezy,
except that the gtk+3.0 patch needs some tweaks;
use_data_uris_for_symbolic_icons.patch does the same for the version
in wheezy.

Could you please prepare packages for O/SPU and coordinate with the
release team?

TIA.

Cheers,
-- 
Raphael Geissert - Debian Developer
www.debian.org - get.debian.net
Index: librsvg-2.26.3/rsvg-image.c
===================================================================
--- librsvg-2.26.3.orig/rsvg-image.c	2013-11-28 12:01:22.865236793 +0100
+++ librsvg-2.26.3/rsvg-image.c	2013-11-28 12:17:25.242370794 +0100
@@ -356,6 +356,51 @@ rsvg_acquire_vfs_resource (const char *f
 }
 #endif
 
+/* Partial origin-based policy, based on the one implemented in f01aded72c38f0e1  */
+gboolean
+_rsvg_acquire_xlink_allow_load (const char *href, const char *base_uri, GError ** err)
+{
+    char *base_scheme = NULL, *href_scheme = NULL;
+
+    if (base_uri)
+        base_scheme = g_uri_parse_scheme (base_uri);
+    if (href)
+        href_scheme = g_uri_parse_scheme (href);
+
+    /* Not a valid URI */
+    if (href_scheme == NULL)
+        goto deny;
+
+    /* Allow loads of data: from any location */
+    if (g_str_equal (href_scheme, "data"))
+        return TRUE;
+
+    /* no valid base URI */
+    if (base_scheme == NULL)
+        goto deny;
+
+    /* Deny loads from differing URI schemes */
+    if (href_scheme == NULL || !g_str_equal (href_scheme, base_scheme))
+        goto deny;
+
+    /* resource: is allowed to load anything from other resources */
+    if (g_str_equal (href_scheme, "resource"))
+        return TRUE;
+
+    /* Non-file: isn't allowed to load anything */
+    if (!g_str_equal (href_scheme, "file"))
+        goto deny;
+
+    /* no local-file policy is applied here */
+
+    return TRUE;
+
+deny:
+    g_set_error (err, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
+                 "File may not link to URI \"%s\"", href);
+    return FALSE;
+}
+
 GByteArray *
 _rsvg_acquire_xlink_href_resource (const char *href, const char *base_uri, GError ** err)
 {
@@ -367,6 +412,9 @@ _rsvg_acquire_xlink_href_resource (const
     if (!strncmp (href, "data:", 5))
         arr = rsvg_acquire_base64_resource (href, NULL);
 
+    if (!_rsvg_acquire_xlink_allow_load(href, base_uri, err))
+        return NULL;
+
     if (!arr)
         arr = rsvg_acquire_file_resource (href, base_uri, NULL);
 
Index: librsvg-2.26.3/rsvg-base.c
===================================================================
--- librsvg-2.26.3.orig/rsvg-base.c	2013-11-28 12:01:22.865236793 +0100
+++ librsvg-2.26.3/rsvg-base.c	2013-11-28 12:13:54.913248784 +0100
@@ -1049,12 +1049,13 @@ rsvg_handle_set_base_uri (RsvgHandle * h
     else
         uri = rsvg_get_base_uri_from_filename (base_uri);
 
-    if (uri) {
-        if (handle->priv->base_uri)
-            g_free (handle->priv->base_uri);
-        handle->priv->base_uri = uri;
-        rsvg_defs_set_base_uri (handle->priv->defs, handle->priv->base_uri);
-    }
+    if (!uri)
+        uri = g_strdup("data:");
+
+    if (handle->priv->base_uri)
+        g_free (handle->priv->base_uri);
+    handle->priv->base_uri = uri;
+    rsvg_defs_set_base_uri (handle->priv->defs, handle->priv->base_uri);
 }
 
 /**
Index: librsvg-2.26.3/rsvg-base.c
===================================================================
--- librsvg-2.26.3.orig/rsvg-base.c	2010-05-01 01:10:51.000000000 +0200
+++ librsvg-2.26.3/rsvg-base.c	2013-11-26 16:24:02.903472891 +0100
@@ -602,6 +602,7 @@ rsvg_start_xinclude (RsvgHandle * ctx, R
                 int result;
 
                 xml_parser = xmlCreatePushParserCtxt (&rsvgSAXHandlerStruct, ctx, NULL, 0, NULL);
+                xml_parser->options |= XML_PARSE_NONET;
                 result = xmlParseChunk (xml_parser, (char *) data->data, data->len, 0);
                 result = xmlParseChunk (xml_parser, "", 0, TRUE);
 
@@ -1118,6 +1119,7 @@ rsvg_handle_write_impl (RsvgHandle * han
     if (handle->priv->ctxt == NULL) {
         handle->priv->ctxt = xmlCreatePushParserCtxt (&rsvgSAXHandlerStruct, handle, NULL, 0,
                                                       rsvg_handle_get_base_uri (handle));
+        handle->priv->ctxt->options |= XML_PARSE_NONET;
 
         /* if false, external entities work, but internal ones don't. if true, internal entities
            work, but external ones don't. favor internal entities, in order to not cause a
Index: gtk+3.0-3.4.2/gtk/gtkicontheme.c
===================================================================
--- gtk+3.0-3.4.2.orig/gtk/gtkicontheme.c	2012-05-02 14:46:50.000000000 +0200
+++ gtk+3.0-3.4.2/gtk/gtkicontheme.c	2013-11-27 14:16:27.393901153 +0100
@@ -3170,6 +3170,8 @@ _gtk_icon_info_load_symbolic_internal (G
   GdkPixbuf *pixbuf;
   gchar *data;
   gchar *success, *warning, *err;
+  gchar *file_data, *escaped_file_data;
+  gsize file_len;
 
   /* css_fg can't possibly have failed, otherwise
    * that would mean we have a broken style */
@@ -3193,6 +3195,11 @@ _gtk_icon_info_load_symbolic_internal (G
       err = gdk_color_to_css (&error_default_color);
     }
 
+  if (!g_file_get_contents (icon_info->filename, &file_data, &file_len, NULL))
+    return NULL;
+
+  escaped_file_data = g_markup_escape_text (file_data, file_len);
+  g_free (file_data);
 
   data = g_strconcat ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
                       "<svg version=\"1.1\"\n"
@@ -3214,9 +3221,10 @@ _gtk_icon_info_load_symbolic_internal (G
                       "      fill: ", css_success ? css_success : success," !important;\n"
                       "    }\n"
                       "  </style>\n"
-                      "  <xi:include href=\"", icon_info->filename, "\"/>\n"
+                      "  <xi:include href=\"data:text/xml,", escaped_file_data, "\"/>\n"
                       "</svg>",
                       NULL);
+  g_free (escaped_file_data);
   g_free (warning);
   g_free (err);
   g_free (success);

Reply via email to