x11: Move length checking into return_if_fail() macro

This commit is contained in:
Benjamin Otte 2013-02-12 19:28:41 +01:00
parent e3206b9de4
commit b36b89151e

View File

@ -112,14 +112,18 @@ notify_changes (XSettingsClient *client,
#define BYTES_LEFT(buffer) ((buffer)->data + (buffer)->len - (buffer)->pos) #define BYTES_LEFT(buffer) ((buffer)->data + (buffer)->len - (buffer)->pos)
#define return_if_fail_bytes(buffer, n_bytes) G_STMT_START{ \
if (BYTES_LEFT (buffer) < (n_bytes)) \
return XSETTINGS_ACCESS; \
}G_STMT_END
static XSettingsResult static XSettingsResult
fetch_card16 (XSettingsBuffer *buffer, fetch_card16 (XSettingsBuffer *buffer,
CARD16 *result) CARD16 *result)
{ {
CARD16 x; CARD16 x;
if (BYTES_LEFT (buffer) < 2) return_if_fail_bytes (buffer, 2);
return XSETTINGS_ACCESS;
x = *(CARD16 *)buffer->pos; x = *(CARD16 *)buffer->pos;
buffer->pos += 2; buffer->pos += 2;
@ -152,8 +156,7 @@ fetch_card32 (XSettingsBuffer *buffer,
{ {
CARD32 x; CARD32 x;
if (BYTES_LEFT (buffer) < 4) return_if_fail_bytes (buffer, 4);
return XSETTINGS_ACCESS;
x = *(CARD32 *)buffer->pos; x = *(CARD32 *)buffer->pos;
buffer->pos += 4; buffer->pos += 4;
@ -170,8 +173,7 @@ static XSettingsResult
fetch_card8 (XSettingsBuffer *buffer, fetch_card8 (XSettingsBuffer *buffer,
CARD8 *result) CARD8 *result)
{ {
if (BYTES_LEFT (buffer) < 1) return_if_fail_bytes (buffer, 1);
return XSETTINGS_ACCESS;
*result = *(CARD8 *)buffer->pos; *result = *(CARD8 *)buffer->pos;
buffer->pos += 1; buffer->pos += 1;
@ -189,10 +191,11 @@ fetch_string (XSettingsBuffer *buffer,
guint pad_len; guint pad_len;
pad_len = XSETTINGS_PAD (length, 4); pad_len = XSETTINGS_PAD (length, 4);
if (pad_len < length /* guard against overflow */ if (pad_len < length) /* guard against overflow */
|| BYTES_LEFT (buffer) < pad_len)
return XSETTINGS_ACCESS; return XSETTINGS_ACCESS;
return_if_fail_bytes (buffer, pad_len);
*result = g_strndup ((char *) buffer->pos, length); *result = g_strndup ((char *) buffer->pos, length);
buffer->pos += pad_len; buffer->pos += pad_len;