summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert McQueen <robot101@debian.org>2006-02-16 00:43:41 +0000
committerRobert McQueen <robot101@debian.org>2006-02-16 00:43:41 +0000
commit0d0642b31b9bac2546f9fa2c6bdc55b5ced0b7ad (patch)
treed8d1984ad270e2ca3db2e73b04e3b0dfcd5e69a6
parent397b0a4ec150c4400de8a041d077c819f6e978bd (diff)
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.
-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;