2003-02-24 Anders Carlsson <andersca@codefactory.se>
+ * dbus/dbus-marshal.c: (_dbus_marshal_validate_arg):
+ * dbus/dbus-message-builder.c: (_dbus_message_data_load):
+ * dbus/dbus-message.c: (dbus_message_append_boolean),
+ (dbus_message_append_boolean_array),
+ (dbus_message_get_args_valist), (_dbus_message_test):
+ * dbus/dbus-message.h:
+ * doc/dbus-specification.sgml:
+ Various fixes as pointed out by Havoc.
+
+ * test/data/invalid-messages/bad-boolean-array.message:
+ * test/data/invalid-messages/bad-boolean.message:
+ Add invalid boolean value test cases.
+
+2003-02-24 Anders Carlsson <andersca@codefactory.se>
+
* dbus/dbus-internals.c: (_dbus_type_to_string):
* dbus/dbus-marshal.c: (_dbus_marshal_get_arg_end_pos),
(_dbus_marshal_validate_arg):
break;
case DBUS_TYPE_BOOLEAN:
+ {
+ unsigned char c;
+
+ c = _dbus_string_get_byte (str, pos + 1);
+
+ if (c != 0 && c != 1)
+ {
+ _dbus_verbose ("boolean value must be either 0 or 1, not %d\n", c);
+ return FALSE;
+ }
+
*end_pos = pos + 2;
break;
-
+ }
case DBUS_TYPE_INT32:
case DBUS_TYPE_UINT32:
{
break;
case DBUS_TYPE_BOOLEAN_ARRAY:
+ {
+ int len, i;
+
+ len = demarshal_and_validate_len (str, byte_order, pos + 1, &pos);
+ if (len < 0)
+ return FALSE;
+
+ i = 0;
+ while (i < len)
+ {
+ unsigned char c = _dbus_string_get_byte (str, pos + i);
+
+ if (c != 0 && c != 1)
+ {
+ _dbus_verbose ("boolean value must be either 0 or 1, not %d (pos %d)\n", c, pos);
+ return FALSE;
+ }
+
+ i++;
+ }
+ *end_pos = pos + len;
+ break;
+ }
case DBUS_TYPE_BYTE_ARRAY:
{
int len;
while (i < _dbus_string_get_length (&line))
{
_dbus_string_skip_blank (&line, i, &i);
- printf ("i is: %d\n", i);
if (_dbus_string_find_to (&line, i, i + 5,
"false", NULL))
*/
dbus_bool_t
dbus_message_append_boolean (DBusMessage *message,
- unsigned char value)
+ dbus_bool_t value)
{
_dbus_assert (!message->locked);
* @returns #TRUE on success
*/
dbus_bool_t
-dbus_message_append_boolean_array (DBusMessage *message,
- unsigned char *value,
- int len)
+dbus_message_append_boolean_array (DBusMessage *message,
+ unsigned const char *value,
+ int len)
{
_dbus_assert (!message->locked);
break;
case DBUS_TYPE_BOOLEAN:
{
- unsigned char *ptr;
+ dbus_bool_t *ptr;
- ptr = va_arg (var_args, unsigned char *);
+ ptr = va_arg (var_args, dbus_bool_t *);
*ptr = dbus_message_iter_get_boolean (iter);
break;
* @param iter the message iter
* @returns the string
*/
-unsigned char
+dbus_bool_t
dbus_message_iter_get_boolean (DBusMessageIter *iter)
{
unsigned char value;
dbus_int32_t our_int;
char *our_str;
double our_double;
+ dbus_bool_t our_bool;
/* Test the vararg functions */
message = dbus_message_new ("org.freedesktop.DBus.Test", "testMessage");
DBUS_TYPE_INT32, -0x12345678,
DBUS_TYPE_STRING, "Test string",
DBUS_TYPE_DOUBLE, 3.14159,
+ DBUS_TYPE_BOOLEAN, TRUE,
0);
_dbus_verbose_bytes_of_string (&message->header, 0,
_dbus_string_get_length (&message->header));
DBUS_TYPE_INT32, &our_int,
DBUS_TYPE_STRING, &our_str,
DBUS_TYPE_DOUBLE, &our_double,
+ DBUS_TYPE_BOOLEAN, &our_bool,
0) != DBUS_RESULT_SUCCESS)
_dbus_assert_not_reached ("Could not get arguments");
if (strcmp (our_str, "Test string") != 0)
_dbus_assert_not_reached ("strings differ!");
+ if (!our_bool)
+ _dbus_assert_not_reached ("booleans differ");
+
dbus_free (our_str);
dbus_message_unref (message);
va_list var_args);
dbus_bool_t dbus_message_append_nil (DBusMessage *message);
dbus_bool_t dbus_message_append_boolean (DBusMessage *message,
- unsigned char value);
+ dbus_bool_t value);
dbus_bool_t dbus_message_append_int32 (DBusMessage *message,
dbus_int32_t value);
dbus_bool_t dbus_message_append_uint32 (DBusMessage *message,
dbus_bool_t dbus_message_append_string (DBusMessage *message,
const char *value);
dbus_bool_t dbus_message_append_boolean_array (DBusMessage *message,
- unsigned char *value,
+ unsigned const char *value,
int len);
dbus_bool_t dbus_message_append_int32_array (DBusMessage *message,
const dbus_int32_t *value,
dbus_bool_t dbus_message_iter_has_next (DBusMessageIter *iter);
dbus_bool_t dbus_message_iter_next (DBusMessageIter *iter);
int dbus_message_iter_get_arg_type (DBusMessageIter *iter);
-unsigned char dbus_message_iter_get_boolean (DBusMessageIter *iter);
+dbus_bool_t dbus_message_iter_get_boolean (DBusMessageIter *iter);
int dbus_message_iter_get_int32 (DBusMessageIter *iter);
int dbus_message_iter_get_uint32 (DBusMessageIter *iter);
double dbus_message_iter_get_double (DBusMessageIter *iter);
</row><row>
<entry>BOOLEAN</entry>
<entry>2</entry>
- <entry>Boolean value, 0 is FALSE and everything else is TRUE.</entry>
+ <entry>Boolean value, 0 is FALSE and 1 is TRUE. Everything else is invalid.</entry>
</row><row>
<entry>INT32</entry>
<entry>3</entry>
--- /dev/null
+## a message with an invalid boolean array
+
+## VALID_HEADER includes a LENGTH Header and LENGTH Body
+VALID_HEADER
+ALIGN 8
+END_LENGTH Header
+START_LENGTH Body
+TYPE BOOLEAN_ARRAY
+ALIGN 4
+INT32 3
+BYTE 0
+BYTE 1
+BYTE 3
+END_LENGTH Body
--- /dev/null
+## a message with an invalid boolean value
+
+## VALID_HEADER includes a LENGTH Header and LENGTH Body
+VALID_HEADER
+ALIGN 8
+END_LENGTH Header
+START_LENGTH Body
+TYPE BOOLEAN
+BYTE 3
+END_LENGTH Body