Bug 629709 - Empty variants

Fix some GVariant bugs uncovered by calling g_variant_new_from_data with
invalid data (which it should be immune to).
This commit is contained in:
Ryan Lortie 2010-09-15 11:20:51 -04:00
parent 1c5b96e92b
commit 11f06115a4
2 changed files with 27 additions and 2 deletions

View File

@ -503,11 +503,33 @@ g_variant_new_from_buffer (const GVariantType *type,
gboolean trusted)
{
GVariant *value;
guint alignment;
gsize size;
value = g_variant_alloc (type, TRUE, trusted);
value->contents.serialised.buffer = g_buffer_ref (buffer);
value->contents.serialised.data = buffer->data;
value->size = buffer->size;
g_variant_type_info_query (value->type_info,
&alignment, &size);
if (size && buffer->size != size)
{
/* Creating a fixed-sized GVariant with a buffer of the wrong
* size.
*
* We should do the equivalent of pulling a fixed-sized child out
* of a brozen container (ie: data is NULL size is equal to the correct
* fixed size).
*/
value->contents.serialised.data = NULL;
value->size = size;
}
else
{
value->contents.serialised.data = buffer->data;
value->size = buffer->size;
}
return value;
}

View File

@ -1544,6 +1544,9 @@ g_variant_serialised_is_normal (GVariantSerialised serialised)
)
if (serialised.data == NULL)
return FALSE;
/* some hard-coded terminal cases */
switch (g_variant_type_info_get_type_char (serialised.type_info))
{