2003-02-24 Anders Carlsson <andersca@codefactory.se>
authorAnders Carlsson <andersca@codefactory.se>
Mon, 24 Feb 2003 20:26:13 +0000 (20:26 +0000)
committerAnders Carlsson <andersca@codefactory.se>
Mon, 24 Feb 2003 20:26:13 +0000 (20:26 +0000)
* 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.

ChangeLog
dbus/dbus-marshal.c
dbus/dbus-message-builder.c
dbus/dbus-message.c
dbus/dbus-message.h
doc/dbus-specification.sgml
test/data/invalid-messages/bad-boolean-array.message [new file with mode: 0644]
test/data/invalid-messages/bad-boolean.message [new file with mode: 0644]

index 803faae..9b6005e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 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):
index 37a9751..b9b2cf5 100644 (file)
@@ -1109,9 +1109,20 @@ _dbus_marshal_validate_arg (const DBusString *str,
       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:
       {
@@ -1162,6 +1173,29 @@ _dbus_marshal_validate_arg (const DBusString *str,
       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;
index 9526a2e..dea50d7 100644 (file)
@@ -661,7 +661,6 @@ _dbus_message_data_load (DBusString       *dest,
          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))
index 0d66491..584acc7 100644 (file)
@@ -1180,7 +1180,7 @@ dbus_message_append_nil (DBusMessage *message)
  */
 dbus_bool_t
 dbus_message_append_boolean (DBusMessage  *message,
-                            unsigned char value)
+                            dbus_bool_t   value)
 {
   _dbus_assert (!message->locked);
   
@@ -1305,9 +1305,9 @@ dbus_message_append_string (DBusMessage *message,
  * @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);
 
@@ -1543,9 +1543,9 @@ dbus_message_get_args_valist (DBusMessage *message,
          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;
@@ -1854,7 +1854,7 @@ dbus_message_iter_get_string (DBusMessageIter *iter)
  * @param iter the message iter
  * @returns the string
  */
-unsigned char 
+dbus_bool_t
 dbus_message_iter_get_boolean (DBusMessageIter *iter)
 {
   unsigned char value;
@@ -3421,6 +3421,7 @@ _dbus_message_test (const char *test_data_dir)
   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");
@@ -3429,6 +3430,7 @@ _dbus_message_test (const char *test_data_dir)
                            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));
@@ -3439,6 +3441,7 @@ _dbus_message_test (const char *test_data_dir)
                             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");
 
@@ -3451,6 +3454,9 @@ _dbus_message_test (const char *test_data_dir)
   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);
   
index ecb7407..bb2b620 100644 (file)
@@ -67,7 +67,7 @@ dbus_bool_t dbus_message_append_args_valist   (DBusMessage          *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,
@@ -77,7 +77,7 @@ dbus_bool_t dbus_message_append_double        (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,
@@ -111,7 +111,7 @@ void          dbus_message_iter_unref             (DBusMessageIter   *iter);
 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);
index 1e49411..b8bc4de 100644 (file)
               </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>
diff --git a/test/data/invalid-messages/bad-boolean-array.message b/test/data/invalid-messages/bad-boolean-array.message
new file mode 100644 (file)
index 0000000..54b31d6
--- /dev/null
@@ -0,0 +1,14 @@
+## 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
diff --git a/test/data/invalid-messages/bad-boolean.message b/test/data/invalid-messages/bad-boolean.message
new file mode 100644 (file)
index 0000000..0755ab5
--- /dev/null
@@ -0,0 +1,10 @@
+## 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