summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog23
-rw-r--r--dbus/dbus-message.c4
-rw-r--r--dbus/dbus-string.c2
-rw-r--r--glib/dbus-gvalue.c7
-rw-r--r--test/glib/test-dbus-glib.c15
5 files changed, 46 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 2b151565..8849ddca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;