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;  | 
