summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-message-factory.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2005-02-06 05:19:50 +0000
committerHavoc Pennington <hp@redhat.com>2005-02-06 05:19:50 +0000
commit96a47516321dea8c08e1ab15ac0102ce3c3ae3f1 (patch)
treee0288218038a701393727546fd275cb1377fdda4 /dbus/dbus-message-factory.c
parent8f04e1e01f51fa9bef564dbaf29be59694407d21 (diff)
2005-02-06 Havoc Pennington <hp@redhat.com>
* dbus/dbus-message-factory.c (generate_special): more tests * dbus/dbus-marshal-validate.c (validate_body_helper): detect array length that exceeds the maximum
Diffstat (limited to 'dbus/dbus-message-factory.c')
-rw-r--r--dbus/dbus-message-factory.c145
1 files changed, 143 insertions, 2 deletions
diff --git a/dbus/dbus-message-factory.c b/dbus/dbus-message-factory.c
index adcb9b2e..37c3d38d 100644
--- a/dbus/dbus-message-factory.c
+++ b/dbus/dbus-message-factory.c
@@ -315,6 +315,22 @@ simple_method_return (void)
return message;
}
+static DBusMessage*
+simple_error (void)
+{
+ DBusMessage *message;
+ message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR);
+ if (message == NULL)
+ _dbus_assert_not_reached ("oom");
+
+ if (!dbus_message_set_error_name (message, "foo.bar"))
+ _dbus_assert_not_reached ("oom");
+
+ set_reply_serial (message);
+
+ return message;
+}
+
static dbus_bool_t
generate_special (DBusMessageDataIter *iter,
DBusString *data,
@@ -354,7 +370,7 @@ generate_special (DBusMessageDataIter *iter,
}
else if (item_seq == 1)
{
- char long_sig[DBUS_MAXIMUM_TYPE_RECURSION_DEPTH+1];
+ char long_sig[DBUS_MAXIMUM_TYPE_RECURSION_DEPTH+2];
const char *v_STRING;
int i;
@@ -372,6 +388,7 @@ generate_special (DBusMessageDataIter *iter,
long_sig[i] = DBUS_TYPE_ARRAY;
++i;
}
+ long_sig[i] = DBUS_TYPE_INVALID;
v_STRING = long_sig;
if (!_dbus_header_set_field_basic (&message->header,
@@ -389,7 +406,7 @@ generate_special (DBusMessageDataIter *iter,
}
else if (item_seq == 2)
{
- char long_sig[DBUS_MAXIMUM_TYPE_RECURSION_DEPTH*2+3];
+ char long_sig[DBUS_MAXIMUM_TYPE_RECURSION_DEPTH*2+4];
const char *v_STRING;
int i;
@@ -416,6 +433,7 @@ generate_special (DBusMessageDataIter *iter,
long_sig[i] = DBUS_STRUCT_END_CHAR;
++i;
}
+ long_sig[i] = DBUS_TYPE_INVALID;
v_STRING = long_sig;
if (!_dbus_header_set_field_basic (&message->header,
@@ -592,6 +610,129 @@ generate_special (DBusMessageDataIter *iter,
*expected_validity = DBUS_INVALID_MISSING_REPLY_SERIAL;
}
+ else if (item_seq == 15)
+ {
+ message = simple_error ();
+
+ if (!dbus_message_set_error_name (message, NULL))
+ _dbus_assert_not_reached ("oom");
+
+ generate_from_message (data, expected_validity, message);
+
+ *expected_validity = DBUS_INVALID_MISSING_ERROR_NAME;
+ }
+ else if (item_seq == 16)
+ {
+ char long_sig[DBUS_MAXIMUM_TYPE_RECURSION_DEPTH*3+6];
+ const char *v_STRING;
+ int i;
+ int n_begins;
+
+ message = simple_method_call ();
+ if (!dbus_message_append_args (message,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INVALID))
+ _dbus_assert_not_reached ("oom");
+
+ i = 0;
+ while (i <= (DBUS_MAXIMUM_TYPE_RECURSION_DEPTH*2 + 2))
+ {
+ long_sig[i] = DBUS_TYPE_ARRAY;
+ ++i;
+ long_sig[i] = DBUS_DICT_ENTRY_BEGIN_CHAR;
+ ++i;
+ }
+ n_begins = i / 2;
+
+ long_sig[i] = DBUS_TYPE_INT32;
+ ++i;
+ long_sig[i] = DBUS_TYPE_INT32;
+ ++i;
+
+ while (n_begins > 0)
+ {
+ long_sig[i] = DBUS_DICT_ENTRY_END_CHAR;
+ ++i;
+ n_begins -= 1;
+ }
+ long_sig[i] = DBUS_TYPE_INVALID;
+
+ v_STRING = long_sig;
+ if (!_dbus_header_set_field_basic (&message->header,
+ DBUS_HEADER_FIELD_SIGNATURE,
+ DBUS_TYPE_SIGNATURE,
+ &v_STRING))
+ _dbus_assert_not_reached ("oom");
+
+ _dbus_header_get_field_raw (&message->header,
+ DBUS_HEADER_FIELD_SIGNATURE,
+ NULL, &pos);
+ generate_from_message (data, expected_validity, message);
+
+ *expected_validity = DBUS_INVALID_EXCEEDED_MAXIMUM_DICT_ENTRY_RECURSION;
+ }
+ else if (item_seq == 17)
+ {
+ message = simple_method_call ();
+ if (!dbus_message_append_args (message,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INVALID))
+ _dbus_assert_not_reached ("oom");
+
+ _dbus_header_get_field_raw (&message->header,
+ DBUS_HEADER_FIELD_SIGNATURE,
+ NULL, &pos);
+ generate_from_message (data, expected_validity, message);
+
+ _dbus_string_set_byte (data, pos + 1, DBUS_TYPE_ARRAY);
+ _dbus_string_set_byte (data, pos + 2, DBUS_DICT_ENTRY_BEGIN_CHAR);
+
+ *expected_validity = DBUS_INVALID_DICT_ENTRY_STARTED_BUT_NOT_ENDED;
+ }
+ else if (item_seq == 18)
+ {
+ message = simple_method_call ();
+ if (!dbus_message_append_args (message,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INVALID))
+ _dbus_assert_not_reached ("oom");
+
+ _dbus_header_get_field_raw (&message->header,
+ DBUS_HEADER_FIELD_SIGNATURE,
+ NULL, &pos);
+ generate_from_message (data, expected_validity, message);
+
+ _dbus_string_set_byte (data, pos + 1, DBUS_DICT_ENTRY_END_CHAR);
+
+ *expected_validity = DBUS_INVALID_DICT_ENTRY_ENDED_BUT_NOT_STARTED;
+ }
+ else if (item_seq == 19)
+ {
+ message = simple_method_call ();
+ if (!dbus_message_append_args (message,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INT32, &v_INT32,
+ DBUS_TYPE_INVALID))
+ _dbus_assert_not_reached ("oom");
+
+ _dbus_header_get_field_raw (&message->header,
+ DBUS_HEADER_FIELD_SIGNATURE,
+ NULL, &pos);
+ generate_from_message (data, expected_validity, message);
+
+ _dbus_string_set_byte (data, pos + 1, DBUS_TYPE_ARRAY);
+ _dbus_string_set_byte (data, pos + 2, DBUS_DICT_ENTRY_BEGIN_CHAR);
+ _dbus_string_set_byte (data, pos + 3, DBUS_DICT_ENTRY_END_CHAR);
+
+ *expected_validity = DBUS_INVALID_DICT_ENTRY_HAS_NO_FIELDS;
+ }
else
{
return FALSE;