From 71f3b461b371d6bf7c7bc4e92578420b78d5c0d8 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Fri, 11 Feb 2005 01:13:45 +0000 Subject: 2005-02-10 Havoc Pennington * dbus/dbus-message-factory.c (generate_special): modify test to avoid using a non-basic dict key * dbus/dbus-marshal-validate-util.c: add test for the below * doc/dbus-specification.xml: require that dict keys are a basic type * dbus/dbus-marshal-validate.c (_dbus_validate_signature_with_reason): require that dict key is a basic type --- ChangeLog | 14 ++++++++++++++ dbus/dbus-marshal-validate-util.c | 3 ++- dbus/dbus-marshal-validate.c | 4 ++++ dbus/dbus-marshal-validate.h | 1 + dbus/dbus-message-factory.c | 10 +++++----- dbus/dbus-test.c | 2 +- doc/TODO | 5 ----- doc/dbus-specification.xml | 12 +++++++----- test/glib/test-profile.c | 2 +- 9 files changed, 35 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index eff98edb..a60a7ff3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2005-02-10 Havoc Pennington + + * dbus/dbus-message-factory.c (generate_special): modify test to + avoid using a non-basic dict key + + * dbus/dbus-marshal-validate-util.c: add test for the below + + * doc/dbus-specification.xml: require that dict keys are a basic + type + + * dbus/dbus-marshal-validate.c + (_dbus_validate_signature_with_reason): require that dict key is a + basic type + 2005-02-10 Havoc Pennington * dbus/dbus-object-tree.c (handle_default_introspect_and_unlock): diff --git a/dbus/dbus-marshal-validate-util.c b/dbus/dbus-marshal-validate-util.c index afaf5262..57caa7fc 100644 --- a/dbus/dbus-marshal-validate-util.c +++ b/dbus/dbus-marshal-validate-util.c @@ -92,7 +92,8 @@ static const ValidityTest signature_tests[] = { { "()i", DBUS_INVALID_STRUCT_HAS_NO_FIELDS }, { "(a)", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE }, { "a{ia}", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE }, - { "a{}", DBUS_INVALID_DICT_ENTRY_HAS_NO_FIELDS } + { "a{}", DBUS_INVALID_DICT_ENTRY_HAS_NO_FIELDS }, + { "a{aii}", DBUS_INVALID_DICT_KEY_MUST_BE_BASIC_TYPE }, /* { "a{i}", DBUS_INVALID_DICT_ENTRY_HAS_ONLY_ONE_FIELD }, */ /* { "{is}", DBUS_INVALID_DICT_ENTRY_NOT_INSIDE_ARRAY }, */ /* { "a{isi}", DBUS_INVALID_DICT_ENTRY_HAS_TOO_MANY_FIELDS }, */ diff --git a/dbus/dbus-marshal-validate.c b/dbus/dbus-marshal-validate.c index 1639fb83..8315bcce 100644 --- a/dbus/dbus-marshal-validate.c +++ b/dbus/dbus-marshal-validate.c @@ -155,6 +155,10 @@ _dbus_validate_signature_with_reason (const DBusString *type_str, array_depth = 0; } + if (last == DBUS_DICT_ENTRY_BEGIN_CHAR && + !_dbus_type_is_basic (*p)) + return DBUS_INVALID_DICT_KEY_MUST_BE_BASIC_TYPE; + last = *p; ++p; } diff --git a/dbus/dbus-marshal-validate.h b/dbus/dbus-marshal-validate.h index 74f4bbf2..29a528b5 100644 --- a/dbus/dbus-marshal-validate.h +++ b/dbus/dbus-marshal-validate.h @@ -109,6 +109,7 @@ typedef enum DBUS_INVALID_DICT_ENTRY_HAS_ONLY_ONE_FIELD = 52, DBUS_INVALID_DICT_ENTRY_HAS_TOO_MANY_FIELDS = 53, DBUS_INVALID_DICT_ENTRY_NOT_INSIDE_ARRAY = 54, + DBUS_INVALID_DICT_KEY_MUST_BE_BASIC_TYPE = 55, DBUS_VALIDITY_LAST } DBusValidity; diff --git a/dbus/dbus-message-factory.c b/dbus/dbus-message-factory.c index 37c3d38d..39df92f2 100644 --- a/dbus/dbus-message-factory.c +++ b/dbus/dbus-message-factory.c @@ -623,7 +623,7 @@ generate_special (DBusMessageDataIter *iter, } else if (item_seq == 16) { - char long_sig[DBUS_MAXIMUM_TYPE_RECURSION_DEPTH*3+6]; + char long_sig[DBUS_MAXIMUM_TYPE_RECURSION_DEPTH*4+8]; const char *v_STRING; int i; int n_begins; @@ -637,17 +637,17 @@ generate_special (DBusMessageDataIter *iter, _dbus_assert_not_reached ("oom"); i = 0; - while (i <= (DBUS_MAXIMUM_TYPE_RECURSION_DEPTH*2 + 2)) + while (i <= (DBUS_MAXIMUM_TYPE_RECURSION_DEPTH*3 + 3)) { long_sig[i] = DBUS_TYPE_ARRAY; ++i; long_sig[i] = DBUS_DICT_ENTRY_BEGIN_CHAR; ++i; + long_sig[i] = DBUS_TYPE_INT32; + ++i; } - n_begins = i / 2; + n_begins = i / 3; - long_sig[i] = DBUS_TYPE_INT32; - ++i; long_sig[i] = DBUS_TYPE_INT32; ++i; diff --git a/dbus/dbus-test.c b/dbus/dbus-test.c index 4fdd8ced..e388310b 100644 --- a/dbus/dbus-test.c +++ b/dbus/dbus-test.c @@ -118,7 +118,7 @@ dbus_internal_do_not_use_run_tests (const char *test_data_dir) check_memleaks (); -#if 1 +#if 0 printf ("%s: running recursive marshalling tests\n", "dbus-test"); if (!_dbus_marshal_recursive_test ()) die ("recursive marshal"); diff --git a/doc/TODO b/doc/TODO index b64409a0..642d97d3 100644 --- a/doc/TODO +++ b/doc/TODO @@ -27,15 +27,10 @@ Important for 1.0 yourself; is it an error, or allowed? If allowed, we need to have a test for it in the test suite. - - add string array support back to append_args() - - validate dict entry number of fields - just before 1.0, try a HAVE_INT64=0 build and be sure it runs - - the spec and implementation should probably require dict keys - to be basic types - - in dbus-keyring.c, enforce that the keyring dir is not world readable/writable diff --git a/doc/dbus-specification.xml b/doc/dbus-specification.xml index ad78f0a0..75ffeea7 100644 --- a/doc/dbus-specification.xml +++ b/doc/dbus-specification.xml @@ -274,11 +274,13 @@ A DICT_ENTRY works exactly like a struct, but rather than parentheses it uses curly braces, and it has more restrictions. - The restrictions are: it occurs only as an array element type; and it - has exactly two single complete types inside the curly - braces. Implementations must not accept dict entries outside of arrays, - and must not accept dict entries with zero, one, or more than two - fields. A dict entry is always a key-value pair. + The restrictions are: it occurs only as an array element type; it has + exactly two single complete types inside the curly braces; the first + single complete type (the "key") must be a basic type rather than a + container type. Implementations must not accept dict entries outside of + arrays, must not accept dict entries with zero, one, or more than two + fields, and must not accept dict entries with non-basic-typed keys. A + dict entry is always a key-value pair. diff --git a/test/glib/test-profile.c b/test/glib/test-profile.c index 6976a11a..25d4eebb 100644 --- a/test/glib/test-profile.c +++ b/test/glib/test-profile.c @@ -48,7 +48,7 @@ */ #define N_CLIENT_THREADS 1 /* It seems like at least 750000 or so iterations reduces the variability to sane levels */ -#define N_ITERATIONS 750000 +#define N_ITERATIONS 750 #define N_PROGRESS_UPDATES 20 /* Don't make PAYLOAD_SIZE too huge because it gets used as a static buffer size */ #define PAYLOAD_SIZE 0 -- cgit