2006-02-16 Robert McQueen <robot101@debian.org>

* dbus/dbus-message.c (dbus_message_iter_get_fixed_array):
	Patch from Rob Taylor <rob.taylor@collabora.co.uk> to correct a bogus
	assertion that the next element to read from the iter is fixed in
	size. This is not the case when you are at the end of the iter,
	because the next element type is INVALID.

	* dbus/dbus-string.c (_dbus_string_init_const_len): Correct a
	a bogus assert which means that you may not initialise a 0-length
	string unless you provide a non-NULL pointer. This prevented
	you from marshalling messages containing zero-length arrays in
	some cases.

	* glib/dbus-gvalue.c (demarshal_collection_array): Another patch
	from Rob to correct bogus asserts when trying to demarshal an
	array and get_fixed_array got you 0 elements. Append nothing to
	the GArray in this case.

	* test/glib/test-dbus-glib.c: Add a test case for round-tripping
	an empty array via the glib bindings. Without all of the above
	patches, this new test fails.
This commit is contained in:
Robert McQueen 2006-02-16 00:43:41 +00:00
parent 397b0a4ec1
commit 0d0642b31b
5 changed files with 46 additions and 5 deletions

View file

@ -1,3 +1,26 @@
2006-02-16 Robert McQueen <robot101@debian.org>
* dbus/dbus-message.c (dbus_message_iter_get_fixed_array):
Patch from Rob Taylor <rob.taylor@collabora.co.uk> to correct a bogus
assertion that the next element to read from the iter is fixed in
size. This is not the case when you are at the end of the iter,
because the next element type is INVALID.
* dbus/dbus-string.c (_dbus_string_init_const_len): Correct a
a bogus assert which means that you may not initialise a 0-length
string unless you provide a non-NULL pointer. This prevented
you from marshalling messages containing zero-length arrays in
some cases.
* glib/dbus-gvalue.c (demarshal_collection_array): Another patch
from Rob to correct bogus asserts when trying to demarshal an
array and get_fixed_array got you 0 elements. Append nothing to
the GArray in this case.
* test/glib/test-dbus-glib.c: Add a test case for round-tripping
an empty array via the glib bindings. Without all of the above
patches, this new test fails.
2006-02-16 Robert McQueen <robot101@debian.org>
* glib/dbus-gmain.c: Make the previous commit compile.

View file

@ -1735,10 +1735,12 @@ dbus_message_iter_get_fixed_array (DBusMessageIter *iter,
int *n_elements)
{
DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
int subtype = _dbus_type_reader_get_current_type(&real->u.reader);
_dbus_return_if_fail (_dbus_message_iter_check (real));
_dbus_return_if_fail (value != NULL);
_dbus_return_if_fail (dbus_type_is_fixed (_dbus_type_reader_get_current_type (&real->u.reader)));
_dbus_return_if_fail ((subtype == DBUS_TYPE_INVALID) ||
dbus_type_is_fixed (subtype));
_dbus_type_reader_read_fixed_multi (&real->u.reader,
value, n_elements);

View file

@ -232,7 +232,7 @@ _dbus_string_init_const_len (DBusString *str,
DBusRealString *real;
_dbus_assert (str != NULL);
_dbus_assert (value != NULL);
_dbus_assert (len == 0 || value != NULL);
_dbus_assert (len <= _DBUS_STRING_MAX_MAX_LENGTH);
_dbus_assert (len >= 0);

View file

@ -1081,9 +1081,10 @@ demarshal_collection_array (DBusGValueMarshalCtx *context,
dbus_message_iter_get_fixed_array (&subiter,
&msgarray,
&msgarray_len);
g_assert (msgarray != NULL);
g_assert (msgarray_len >= 0);
g_array_append_vals (ret, msgarray, (guint) msgarray_len);
g_assert (msgarray != NULL || msgarray_len == 0);
if (msgarray_len)
g_array_append_vals (ret, msgarray, (guint) msgarray_len);
g_value_set_boxed_take_ownership (value, ret);

View file

@ -759,6 +759,21 @@ main (int argc, char **argv)
run_mainloop ();
{
GArray *array;
guint32 arraylen;
array = g_array_new (FALSE, TRUE, sizeof (guint32));
arraylen = 0;
g_print ("Calling (wrapped) zero-length recursive1\n");
if (!org_freedesktop_DBus_Tests_MyObject_recursive1 (proxy, array,
&arraylen, &error))
lose_gerror ("Failed to complete (wrapped) zero-length recursive1 call", error);
if (arraylen != 0)
lose ("(wrapped) zero-length recursive1 call returned invalid length %u", arraylen);
}
{
GArray *array;
guint32 val;