diff options
-rw-r--r-- | ChangeLog | 23 | ||||
-rw-r--r-- | dbus/dbus-message.c | 4 | ||||
-rw-r--r-- | dbus/dbus-string.c | 2 | ||||
-rw-r--r-- | glib/dbus-gvalue.c | 7 | ||||
-rw-r--r-- | test/glib/test-dbus-glib.c | 15 |
5 files changed, 46 insertions, 5 deletions
@@ -1,5 +1,28 @@ 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. * python/_dbus.py, python/matchrules.py: Patch from Ole Andre diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index eb0e86cc..06c75b06 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -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); diff --git a/dbus/dbus-string.c b/dbus/dbus-string.c index eb5ea91b..6bd3d57b 100644 --- a/dbus/dbus-string.c +++ b/dbus/dbus-string.c @@ -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); diff --git a/glib/dbus-gvalue.c b/glib/dbus-gvalue.c index 3e8cf1e7..e06a8fee 100644 --- a/glib/dbus-gvalue.c +++ b/glib/dbus-gvalue.c @@ -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); diff --git a/test/glib/test-dbus-glib.c b/test/glib/test-dbus-glib.c index 0a99eda2..ebcfaeaa 100644 --- a/test/glib/test-dbus-glib.c +++ b/test/glib/test-dbus-glib.c @@ -761,6 +761,21 @@ main (int argc, char **argv) { 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; guint32 arraylen; |