Fixed remarshalling and getting signature
authorAdrian Szyndela <adrian.s@samsung.com>
Tue, 2 Feb 2016 13:27:50 +0000 (14:27 +0100)
committerAdrian Szyndela <adrian.s@samsung.com>
Fri, 19 Feb 2016 10:54:00 +0000 (11:54 +0100)
A few fixes:
- remarshalling to GVariant lacked locking of messages. It caused
  missing signature and offsets.
- dbus_message_get_signature returned signature with outer parentheses.
- removed unused param in _dbus_header_load_gvariant().
- editorial corrections in kdbus_decode_dbus_message().

Change-Id: I29ca21cef6769b725be0c98580f54313bda842c8

dbus/dbus-marshal-gvariant.c
dbus/dbus-marshal-gvariant.h
dbus/dbus-marshal-header.c
dbus/dbus-message.c
dbus/dbus-transport-kdbus.c

index d319108..6b4c877 100644 (file)
@@ -654,7 +654,6 @@ _dbus_marshal_skip_gvariant_basic (const DBusString *str,
 
 dbus_bool_t
 _dbus_header_load_gvariant (DBusHeader     *header,
-                            DBusTypeReader *reader,
                             DBusValidity   *validity)
 {
   size_t fields_offsets[DBUS_HEADER_FIELD_LAST];
index 79d23a0..6802ace 100644 (file)
@@ -77,7 +77,6 @@ void          _dbus_marshal_skip_gvariant_basic      (const DBusString *str,
                                                       int              *pos);
 
 dbus_bool_t   _dbus_header_load_gvariant             (DBusHeader     *header,
-                                                      DBusTypeReader *reader,
                                                       DBusValidity   *validity);
 
 dbus_bool_t   _dbus_gvariant_raw_get_lengths         (const DBusString *str,
index bd98a12..ab85d69 100644 (file)
@@ -1235,7 +1235,7 @@ _dbus_header_load (DBusHeader        *header,
     }
   if (reader.gvariant)
     {
-      if (!_dbus_header_load_gvariant (header, &reader, validity))
+      if (!_dbus_header_load_gvariant (header, validity))
         goto invalid;
     }
   else
index 07cd3b8..60ca85d 100644 (file)
@@ -185,14 +185,16 @@ get_const_signature (DBusMessage       *message,
                                                                 type_str_p,
                                                                 type_pos_p,
                                                                 &type_str_len);
-          if (got_signature)
+          if (got_signature && type_str_len > 1)
             {
               message->signature = dbus_new (DBusString, 1);
               got_signature = got_signature &&
-                             _dbus_string_init_preallocated (message->signature, type_str_len + 1);
+                             _dbus_string_init_preallocated (message->signature, type_str_len - 1);
 
+              /* we need to copy the signature, but to ensure backward compatibility
+               * it must be stripped off outer parentheses - they are always there */
               got_signature = got_signature &&
-                              _dbus_string_copy_len (*type_str_p, *type_pos_p, type_str_len,
+                              _dbus_string_copy_len (*type_str_p, *type_pos_p + 1, type_str_len - 2,
                                                      message->signature, 0);
               got_signature = got_signature &&
                               _dbus_string_append_byte (message->signature, 0);
@@ -5238,8 +5240,10 @@ _dbus_message_remarshal (DBusMessage *message, dbus_bool_t gvariant)
   if (!gvariant)
     _dbus_header_update_lengths (&ret->header,
                                  _dbus_string_get_length (&ret->body));
-  /* For GVariant: */
+    /* For GVariant: */
     /* Field: SIGNATURE to body; add body offset - this is done with dbus_message_lock() */
+  else
+    dbus_message_lock (ret);
 
   return ret;
 
index ae7f5e2..7eaf767 100644 (file)
@@ -2629,7 +2629,7 @@ _handle_padding (const struct kdbus_msg *msg,
 
 static int
 kdbus_decode_dbus_message (const struct kdbus_msg *msg,
-                           char *data,
+                           char                   *data,
                            DBusTransportKdbus     *kdbus_transport,
                            int                    *fds,
                            int                    *n_fds)
@@ -3036,16 +3036,12 @@ kdbus_read_message (DBusTransportKdbus *kdbus_transport,
   ret_size = kdbus_decode_msg (msg, data, kdbus_transport, fds, n_fds);
 
   if (ret_size == -1) /* error */
-    {
-      _dbus_string_set_length (buffer, start);
-      return -1;
-    }
-  else if (buf_size != ret_size) /* case of locally generated message */
-    {
-      _dbus_string_set_length (buffer, start + ret_size);
-    }
+    _dbus_string_set_length (buffer, start);
+  else if (ret_size >= 0 && buf_size != ret_size) /* case of locally generated message */
+    _dbus_string_set_length (buffer, start + ret_size);
 
-  _dbus_message_loader_set_unique_sender_id (kdbus_transport->base.loader, msg->src_id);
+  if (ret_size >= 0)
+    _dbus_message_loader_set_unique_sender_id (kdbus_transport->base.loader, msg->src_id);
 
   if (kdbus_transport->activator != NULL)
     return ret_size;