[gtk+] cssprovider: Handle non-NULL-terminated data
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] cssprovider: Handle non-NULL-terminated data
- Date: Fri, 26 Aug 2011 14:35:37 +0000 (UTC)
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]