2003-01-24 Havoc Pennington <hp@pobox.com>
authorHavoc Pennington <hp@redhat.com>
Sat, 25 Jan 2003 01:26:49 +0000 (01:26 +0000)
committerHavoc Pennington <hp@redhat.com>
Sat, 25 Jan 2003 01:26:49 +0000 (01:26 +0000)
* dbus/dbus-list.c (alloc_link): put a thread lock on the global
list_pool

* bus/driver.c (bus_driver_handle_list_services): fix a leak
on OOM

ChangeLog
bus/driver.c
dbus/dbus-list.c

index 2fedb45..92cfe5e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-01-24  Havoc Pennington  <hp@pobox.com>
+
+       * dbus/dbus-list.c (alloc_link): put a thread lock on the global
+       list_pool
+
+       * bus/driver.c (bus_driver_handle_list_services): fix a leak 
+       on OOM
+
 2003-01-25  Anders Carlsson  <andersca@codefactory.se>
 
        * dbus/dbus-list.c: (alloc_link), (free_link):
index da167bb..eacca93 100644 (file)
@@ -248,7 +248,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
   services = bus_services_list (&len);
 
   if (!services)
-    return;
+    goto error;
   
   if (!dbus_message_append_fields (reply,
                                   DBUS_TYPE_STRING_ARRAY, services, len,
@@ -260,9 +260,12 @@ bus_driver_handle_list_services (DBusConnection *connection,
   
  error:
   dbus_message_unref (reply);
-  for (i = 0; i < len; i++)
-    dbus_free (services[i]);
-  dbus_free (services);
+  if (services != NULL)
+    {
+      for (i = 0; i < len; i++)
+        dbus_free (services[i]);
+      dbus_free (services);
+    }
 }
 
 /* This is where all the magic occurs */
index 42fc79b..546da5c 100644 (file)
@@ -24,6 +24,7 @@
 #include "dbus-internals.h"
 #include "dbus-list.h"
 #include "dbus-mempool.h"
+#include "dbus-threads.h"
 
 /**
  * @defgroup DBusList Linked list
@@ -34,6 +35,7 @@
  */
 
 static DBusMemPool *list_pool;
+static DBusStaticMutex list_pool_lock = DBUS_STATIC_MUTEX_INIT;
 
 /**
  * @defgroup DBusListInternals Linked list implementation details
@@ -45,16 +47,32 @@ static DBusMemPool *list_pool;
  * @{
  */
 
+/* the mem pool is probably a speed hit, with the thread
+ * lock, though it does still save memory - unknown.
+ */
 static DBusList*
 alloc_link (void *data)
 {
   DBusList *link;
 
+  if (!dbus_static_mutex_lock (&list_pool_lock))
+    return NULL;
+  
   if (!list_pool)
-    list_pool = _dbus_mem_pool_new (sizeof (DBusList), TRUE);
+    {      
+      list_pool = _dbus_mem_pool_new (sizeof (DBusList), TRUE);
 
+      if (list_pool == NULL)
+        {
+          dbus_static_mutex_unlock (&list_pool_lock);
+          return NULL;
+        }
+    }
+  
   link = _dbus_mem_pool_alloc (list_pool);
   link->data = data;
+  
+  dbus_static_mutex_unlock (&list_pool_lock);
 
   return link;
 }
@@ -62,7 +80,9 @@ alloc_link (void *data)
 static void
 free_link (DBusList *link)
 {
+  dbus_static_mutex_lock (&list_pool_lock);
   _dbus_mem_pool_dealloc (list_pool, link);
+  dbus_static_mutex_unlock (&list_pool_lock);
 }
 
 static void