From 15a610bc4c87d389463112ef0ad4fde195af83ca Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Tue, 12 Jun 2007 19:39:47 +0000 Subject: 2007-06-12 Havoc Pennington * dbus/dbus-message.c (dbus_message_iter_open_container): improve the checks/warnings for contained_signature a bit --- dbus/dbus-marshal-recursive.c | 27 ++++++++++++++++++++------- dbus/dbus-message.c | 17 ++++++++++------- 2 files changed, 30 insertions(+), 14 deletions(-) (limited to 'dbus') diff --git a/dbus/dbus-marshal-recursive.c b/dbus/dbus-marshal-recursive.c index b16f4ea5..3a3e8052 100644 --- a/dbus/dbus-marshal-recursive.c +++ b/dbus/dbus-marshal-recursive.c @@ -1645,9 +1645,18 @@ writer_recurse_init_and_check (DBusTypeWriter *writer, if (expected != sub->container_type) { - _dbus_warn_check_failed ("Writing an element of type %s, but the expected type here is %s\n", - _dbus_type_to_string (sub->container_type), - _dbus_type_to_string (expected)); + if (expected != DBUS_TYPE_INVALID) + _dbus_warn_check_failed ("Writing an element of type %s, but the expected type here is %s\n" + "The overall signature expected here was '%s' and we are on byte %d of that signature.\n", + _dbus_type_to_string (sub->container_type), + _dbus_type_to_string (expected), + _dbus_string_get_const_data (writer->type_str), writer->type_pos); + else + _dbus_warn_check_failed ("Writing an element of type %s, but no value is expected here\n", + "The overall signature expected here was '%s' and we are on byte %d of that signature.\n", + _dbus_type_to_string (sub->container_type), + _dbus_string_get_const_data (writer->type_str), writer->type_pos); + _dbus_assert_not_reached ("bad array element or variant content written"); } } @@ -1703,11 +1712,15 @@ write_or_verify_typecode (DBusTypeWriter *writer, if (expected != typecode) { if (expected != DBUS_TYPE_INVALID) - _dbus_warn_check_failed ("Array or variant type requires that type %s be written, but %s was written\n", - _dbus_type_to_string (expected), _dbus_type_to_string (typecode)); + _dbus_warn_check_failed ("Array or variant type requires that type %s be written, but %s was written.\n" + "The overall signature expected here was '%s' and we are on byte %d of that signature.\n", + _dbus_type_to_string (expected), _dbus_type_to_string (typecode), + _dbus_string_get_const_data (writer->type_str), writer->type_pos); else - _dbus_warn_check_failed ("Array or variant type wasn't expecting any more values to be written into it, but a value %s was written\n", - _dbus_type_to_string (typecode)); + _dbus_warn_check_failed ("Array or variant type wasn't expecting any more values to be written into it, but a value %s was written.\n" + "The overall signature expected here was '%s' and we are on byte %d of that signature.\n", + _dbus_type_to_string (typecode), + _dbus_string_get_const_data (writer->type_str), writer->type_pos); _dbus_assert_not_reached ("bad type inserted somewhere inside an array or variant"); } } diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index a98a0f8c..a64888ef 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -2350,16 +2350,19 @@ dbus_message_iter_open_container (DBusMessageIter *iter, contained_signature == NULL) || (type == DBUS_TYPE_DICT_ENTRY && contained_signature == NULL) || - contained_signature != NULL, FALSE); + (type == DBUS_TYPE_VARIANT && + contained_signature != NULL) || + (type == DBUS_TYPE_ARRAY && + contained_signature != NULL), FALSE); -#if 0 - /* FIXME this would fail if the contained_signature is a dict entry, - * since dict entries are invalid signatures standalone (they must be in + /* this would fail if the contained_signature is a dict entry, since + * dict entries are invalid signatures standalone (they must be in * an array) */ - _dbus_return_val_if_fail (contained_signature == NULL || - _dbus_check_is_valid_signature (contained_signature)); -#endif + _dbus_return_val_if_fail (type == DBUS_TYPE_DICT_ENTRY || + (contained_signature == NULL || + _dbus_check_is_valid_signature (contained_signature)), + FALSE); if (!_dbus_message_iter_open_signature (real)) return FALSE; -- cgit