[gtk+] cssprovider: Handle non-NULL-terminated data



commit ebf0b6ee4dcea17b376efedeee1ee8a158d8f969
Author: Benjamin Otte <otte redhat com>
Date:   Fri Jun 17 05:15:48 2011 +0200

    cssprovider: Handle non-NULL-terminated data
    
    Do a dumb copy if that happens.

 gtk/gtkcssprovider.c |   52 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 32 insertions(+), 20 deletions(-)
---
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index be93730..acc0e30 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -1022,7 +1022,6 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
                                 GtkCssScanner  *scanner,
                                 GFile          *file,
                                 const char     *data,
-                                gsize           length,
                                 GError        **error);
 
 GQuark
@@ -1247,13 +1246,10 @@ gtk_css_scanner_new (GtkCssProvider *provider,
                      GtkCssScanner  *parent,
                      GtkCssSection  *section,
                      GFile          *file,
-                     const gchar    *data,
-                     gsize           length)
+                     const gchar    *text)
 {
   GtkCssScanner *scanner;
 
-  g_assert (data[length] == 0);
-
   scanner = g_slice_new0 (GtkCssScanner);
 
   g_object_ref (provider);
@@ -1274,7 +1270,7 @@ gtk_css_scanner_new (GtkCssProvider *provider,
       g_free (dir);
     }
 
-  scanner->parser = _gtk_css_parser_new (data,
+  scanner->parser = _gtk_css_parser_new (text,
                                          gtk_css_scanner_parser_error,
                                          scanner);
 
@@ -1313,7 +1309,8 @@ gtk_css_scanner_push_section (GtkCssScanner     *scanner,
                                   scanner->parser,
                                   scanner->file);
 
-  gtk_css_section_unref (scanner->section);
+  if (scanner->section)
+    gtk_css_section_unref (scanner->section);
   scanner->section = section;
 }
 
@@ -1719,7 +1716,7 @@ parse_import (GtkCssScanner *scanner)
       gtk_css_provider_load_internal (scanner->provider,
                                       scanner,
                                       file,
-                                      NULL, 0,
+                                      NULL,
                                       NULL);
     }
 
@@ -2470,8 +2467,7 @@ static gboolean
 gtk_css_provider_load_internal (GtkCssProvider *css_provider,
                                 GtkCssScanner  *parent,
                                 GFile          *file,
-                                const char     *data,
-                                gsize           length,
+                                const char     *text,
                                 GError        **error)
 {
   GtkCssScanner *scanner;
@@ -2486,15 +2482,15 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
   else
     error_handler = 0; /* silence gcc */
 
-  if (data == NULL)
+  if (text == NULL)
     {
       GError *load_error = NULL;
 
       if (g_file_load_contents (file, NULL,
-                                &free_data, &length,
+                                &free_data, NULL,
                                 NULL, &load_error))
         {
-          data = free_data;
+          text = free_data;
         }
       else
         {
@@ -2518,14 +2514,13 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
         }
     }
 
-  if (data)
+  if (text)
     {
       scanner = gtk_css_scanner_new (css_provider,
                                      parent,
                                      parent ? parent->section : NULL,
                                      file,
-                                     data,
-                                     length);
+                                     text);
 
       parse_stylesheet (scanner);
 
@@ -2556,7 +2551,9 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
  * gtk_css_provider_load_from_data:
  * @css_provider: a #GtkCssProvider
  * @data: (array length=length) (element-type guint8): CSS data loaded in memory
- * @length: the length of @data in bytes, or -1 for NUL terminated strings
+ * @length: the length of @data in bytes, or -1 for NUL terminated strings. If
+ *   @length is not -1, the code will assume it is not NUL terminated and will
+ *   potentially do a copy.
  * @error: (out) (allow-none): return location for a #GError, or %NULL
  *
  * Loads @data into @css_provider, making it clear any previously loaded
@@ -2570,15 +2567,30 @@ gtk_css_provider_load_from_data (GtkCssProvider  *css_provider,
                                  gssize           length,
                                  GError         **error)
 {
+  char *free_data;
+  gboolean ret;
+
   g_return_val_if_fail (GTK_IS_CSS_PROVIDER (css_provider), FALSE);
   g_return_val_if_fail (data != NULL, FALSE);
 
   if (length < 0)
-    length = strlen (data);
+    {
+      length = strlen (data);
+      free_data = NULL;
+    }
+  else
+    {
+      free_data = g_strndup (data, length);
+      data = free_data;
+    }
 
   gtk_css_provider_reset (css_provider);
 
-  return gtk_css_provider_load_internal (css_provider, NULL, NULL, data, length, error);
+  ret = gtk_css_provider_load_internal (css_provider, NULL, NULL, data, error);
+
+  g_free (free_data);
+
+  return ret;
 }
 
 /**
@@ -2602,7 +2614,7 @@ gtk_css_provider_load_from_file (GtkCssProvider  *css_provider,
 
   gtk_css_provider_reset (css_provider);
 
-  return gtk_css_provider_load_internal (css_provider, NULL, file, NULL, 0, error);
+  return gtk_css_provider_load_internal (css_provider, NULL, file, NULL, error);
 }
 
 /**



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