[gtk+] x11: Split out xsettings string reading code
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] x11: Split out xsettings string reading code
- Date: Tue, 19 Feb 2013 13:48:02 +0000 (UTC)
commit c84e303fb5bc0aa873edf38ed1b18237b08cb099
Author: Benjamin Otte <otte redhat com>
Date: Tue Feb 12 18:45:03 2013 +0100
x11: Split out xsettings string reading code
gdk/x11/xsettings-client.c | 51 +++++++++++++++++++++----------------------
1 files changed, 25 insertions(+), 26 deletions(-)
---
diff --git a/gdk/x11/xsettings-client.c b/gdk/x11/xsettings-client.c
index d26ce76..c693211 100644
--- a/gdk/x11/xsettings-client.c
+++ b/gdk/x11/xsettings-client.c
@@ -187,6 +187,24 @@ fetch_card8 (XSettingsBuffer *buffer,
#define XSETTINGS_PAD(n,m) ((n + m - 1) & (~(m-1)))
+static XSettingsResult
+fetch_string (XSettingsBuffer *buffer,
+ guint length,
+ char **result)
+{
+ guint pad_len;
+
+ pad_len = XSETTINGS_PAD (length, 4);
+ if (pad_len < length /* guard against overflow */
+ || BYTES_LEFT (buffer) < pad_len)
+ return XSETTINGS_ACCESS;
+
+ *result = g_strndup ((char *) buffer->pos, length);
+ buffer->pos += pad_len;
+
+ return XSETTINGS_SUCCESS;
+}
+
static GHashTable *
parse_settings (unsigned char *data,
size_t len)
@@ -228,7 +246,6 @@ parse_settings (unsigned char *data,
CARD8 type;
CARD16 name_len;
CARD32 v_int;
- size_t pad_len;
result = fetch_card8 (&buffer, &type);
if (result != XSETTINGS_SUCCESS)
@@ -240,21 +257,13 @@ parse_settings (unsigned char *data,
if (result != XSETTINGS_SUCCESS)
goto out;
- pad_len = XSETTINGS_PAD(name_len, 4);
- if (BYTES_LEFT (&buffer) < pad_len)
- {
- result = XSETTINGS_ACCESS;
- goto out;
- }
-
setting = g_new (XSettingsSetting, 1);
setting->type = XSETTINGS_TYPE_INT; /* No allocated memory */
- setting->name = g_malloc (name_len + 1);
-
- memcpy (setting->name, buffer.pos, name_len);
- setting->name[name_len] = '\0';
- buffer.pos += pad_len;
+ setting->name = NULL;
+ result = fetch_string (&buffer, name_len, &setting->name);
+ if (result != XSETTINGS_SUCCESS)
+ goto out;
/* last change serial (we ignore it) */
result = fetch_card32 (&buffer, &v_int);
@@ -276,20 +285,10 @@ parse_settings (unsigned char *data,
if (result != XSETTINGS_SUCCESS)
goto out;
- pad_len = XSETTINGS_PAD (v_int, 4);
- if (v_int + 1 == 0 || /* Guard against wrap-around */
- BYTES_LEFT (&buffer) < pad_len)
- {
- result = XSETTINGS_ACCESS;
- goto out;
- }
-
- setting->data.v_string = g_malloc (v_int + 1);
+ result = fetch_string (&buffer, v_int, &setting->data.v_string);
+ if (result != XSETTINGS_SUCCESS)
+ goto out;
- memcpy (setting->data.v_string, buffer.pos, v_int);
- setting->data.v_string[v_int] = '\0';
- buffer.pos += pad_len;
-
GDK_NOTE(SETTINGS, g_print(" %s = \"%s\"\n", setting->name, setting->data.v_string));
break;
case XSETTINGS_TYPE_COLOR:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]