fix for memleaks 16/66016/2
authorAdrian Szyndela <adrian.s@samsung.com>
Thu, 14 Apr 2016 12:35:57 +0000 (14:35 +0200)
committerAdrian Szyndela <adrian.s@samsung.com>
Thu, 14 Apr 2016 14:48:39 +0000 (16:48 +0200)
Freeing non-converted message after conversion
Freeing string objects
Freeing unique name in kdbus transport at end-of-life
Freeing matchmaker in kdbus transport at end-of-life

Change-Id: Iae4e231c52b78af3efd5a8a366fc01e50b03feeb

dbus/dbus-connection.c
dbus/dbus-message.c
dbus/dbus-signals.c
dbus/dbus-transport-kdbus.c

index e6c29fd..5531fbb 100644 (file)
@@ -594,12 +594,13 @@ _dbus_connection_queue_synthesized_message_link (DBusConnection *connection,
   msg = (DBusMessage *)link->data;
 
   rmsg = msg;
-  _dbus_transport_assure_protocol_version (connection->transport, &rmsg);
-
-  if (rmsg != msg) {
-    _dbus_list_free_link(link);
-    link = _dbus_list_alloc_link (rmsg);
-  }
+  if (_dbus_transport_assure_protocol_version (connection->transport, &rmsg))
+    {
+      /* If the message is converted, then we don't need the old format anymore */
+      _dbus_list_free_link(link);
+      link = _dbus_list_alloc_link (rmsg);
+      dbus_message_unref (msg);
+    }
 
   _dbus_list_append_link (&connection->incoming_messages, link);
 
@@ -2085,7 +2086,13 @@ _dbus_connection_send_preallocated_unlocked_no_update (DBusConnection       *con
   dbus_message_lock (message);
 
   /* This converts message if neccessary */
-  _dbus_transport_assure_protocol_version (connection->transport, &message);
+  if (!_dbus_transport_assure_protocol_version (connection->transport, &message))
+    {
+      /* Only non-converted messages must be refed.
+       * Converted messages are local anyway.
+       */
+      dbus_message_ref (message);
+    }
 
   preallocated->queue_link->data = message;
   _dbus_list_prepend_link (&connection->outgoing_messages,
@@ -2099,8 +2106,6 @@ _dbus_connection_send_preallocated_unlocked_no_update (DBusConnection       *con
   dbus_free (preallocated);
   preallocated = NULL;
   
-  dbus_message_ref (message);
-  
   connection->n_outgoing += 1;
 
   _dbus_verbose ("Message %p (%s %s %s %s '%s') for %s added to outgoing queue %p, %d pending to send\n",
index 60ca85d..54056f3 100644 (file)
@@ -742,12 +742,14 @@ dbus_message_cache_or_finalize (DBusMessage *message)
   if (NULL != message->signature)
   {
     _dbus_string_free (message->signature);
+    dbus_free (message->signature);
     message->signature = NULL;
   }
 
   if (NULL != message->unique_sender)
   {
     _dbus_string_free (message->unique_sender);
+    dbus_free (message->unique_sender);
     message->unique_sender = NULL;
   }
 
@@ -4486,6 +4488,7 @@ set_unique_sender (DBusMessage *message, uint64_t unique_sender_id)
   if (!_dbus_string_append_printf (message->unique_sender, ":1.%llu", (unsigned long long)unique_sender_id))
     {
       _dbus_string_free (message->unique_sender);
+      dbus_free (message->unique_sender);
       message->unique_sender = NULL;
       return FALSE;
     }
@@ -5317,8 +5320,9 @@ _dbus_message_assure_dbus1 (DBusMessage **message)
   if ((*message)->header.protocol_version != DBUS_MAJOR_PROTOCOL_VERSION)
     {
       *message = _dbus_message_remarshal (*message, FALSE);
+      return TRUE;
     }
-  return *message != NULL;
+  return FALSE;
 }
 
 dbus_bool_t
@@ -5327,8 +5331,9 @@ _dbus_message_assure_gvariant (DBusMessage **message)
   if ((*message)->header.protocol_version != DBUS_PROTOCOL_VERSION_GVARIANT)
     {
       *message = _dbus_message_remarshal (*message, TRUE);
+      return TRUE;
     }
-  return *message != NULL;
+  return FALSE;
 }
 
 /** @} */
index d6756b4..68fbeb5 100644 (file)
@@ -1548,7 +1548,9 @@ free_matchmaker (Matchmaker *matchmaker)
           if (*items == NULL)
             _dbus_hash_iter_remove_entry (&iter);
         }
+      _dbus_hash_table_unref (p->rules_by_iface);
     }
+  dbus_free (matchmaker);
 }
 
 int
index f8fad93..8170a0c 100644 (file)
@@ -3389,6 +3389,7 @@ transport_finalize (DBusTransport *transport)
   free_policies ( kdbus_transport );
 
   _kdbus_free (kdbus_transport->kdbus);
+  free (kdbus_transport->my_DBus_unique_name);
 
   dbus_free (transport);
 }