x11: Split out xsettings string reading code

This commit is contained in:
Benjamin Otte
2013-02-12 18:45:03 +01:00
parent 2b83062fc6
commit c84e303fb5

View File

@ -187,6 +187,24 @@ fetch_card8 (XSettingsBuffer *buffer,
#define XSETTINGS_PAD(n,m) ((n + m - 1) & (~(m-1))) #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 * static GHashTable *
parse_settings (unsigned char *data, parse_settings (unsigned char *data,
size_t len) size_t len)
@ -228,7 +246,6 @@ parse_settings (unsigned char *data,
CARD8 type; CARD8 type;
CARD16 name_len; CARD16 name_len;
CARD32 v_int; CARD32 v_int;
size_t pad_len;
result = fetch_card8 (&buffer, &type); result = fetch_card8 (&buffer, &type);
if (result != XSETTINGS_SUCCESS) if (result != XSETTINGS_SUCCESS)
@ -240,21 +257,13 @@ parse_settings (unsigned char *data,
if (result != XSETTINGS_SUCCESS) if (result != XSETTINGS_SUCCESS)
goto out; 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 = g_new (XSettingsSetting, 1);
setting->type = XSETTINGS_TYPE_INT; /* No allocated memory */ setting->type = XSETTINGS_TYPE_INT; /* No allocated memory */
setting->name = g_malloc (name_len + 1); setting->name = NULL;
result = fetch_string (&buffer, name_len, &setting->name);
memcpy (setting->name, buffer.pos, name_len); if (result != XSETTINGS_SUCCESS)
setting->name[name_len] = '\0'; goto out;
buffer.pos += pad_len;
/* last change serial (we ignore it) */ /* last change serial (we ignore it) */
result = fetch_card32 (&buffer, &v_int); result = fetch_card32 (&buffer, &v_int);
@ -276,20 +285,10 @@ parse_settings (unsigned char *data,
if (result != XSETTINGS_SUCCESS) if (result != XSETTINGS_SUCCESS)
goto out; goto out;
pad_len = XSETTINGS_PAD (v_int, 4); result = fetch_string (&buffer, v_int, &setting->data.v_string);
if (v_int + 1 == 0 || /* Guard against wrap-around */ if (result != XSETTINGS_SUCCESS)
BYTES_LEFT (&buffer) < pad_len) goto out;
{
result = XSETTINGS_ACCESS;
goto out;
}
setting->data.v_string = g_malloc (v_int + 1);
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)); GDK_NOTE(SETTINGS, g_print(" %s = \"%s\"\n", setting->name, setting->data.v_string));
break; break;
case XSETTINGS_TYPE_COLOR: case XSETTINGS_TYPE_COLOR: