ensure we never have any children objects linked when we free a parent
authorKay Sievers <kay@vrfy.org>
Sat, 22 Mar 2014 21:29:56 +0000 (22:29 +0100)
committerKay Sievers <kay@vrfy.org>
Sat, 22 Mar 2014 21:29:56 +0000 (22:29 +0100)
bus.c
bus.h
connection.c
domain.c
endpoint.c
kdbus.h
policy.h

diff --git a/bus.c b/bus.c
index 8d8b2cf9d8e76b668873a863b30cc7afaef6ff5b..90f764443c46353d33685f2e0d73d9b2abc31267 100644 (file)
--- a/bus.c
+++ b/bus.c
@@ -68,6 +68,10 @@ static void __kdbus_bus_free(struct kref *kref)
 {
        struct kdbus_bus *bus = container_of(kref, struct kdbus_bus, kref);
 
+       BUG_ON(!list_empty(&bus->ep_list));
+       BUG_ON(!list_empty(&bus->monitors_list));
+       BUG_ON(!hash_empty(bus->conn_hash));
+
        kdbus_bus_disconnect(bus);
        atomic_dec(&bus->user->buses);
        kdbus_domain_user_unref(bus->user);
diff --git a/bus.h b/bus.h
index 1139da96a1a1c8b0c855431bb69522f04e5d09de..3eda7273dea5f27358ab2ef028f6d595fba1e149 100644 (file)
--- a/bus.h
+++ b/bus.h
@@ -35,7 +35,7 @@
  * @ep_list:           Endpoints on this bus
  * @bus_flags:         Simple pass-through flags from userspace to userspace
  * @name_registry:     Domain's list of buses
- * @domain_entry:              Domain's list of buses
+ * @domain_entry:      Domain's list of buses
  * @monitors_list:     Connections that monitor this bus
  * @bloom:             Bloom parameters
  * @id128:             Unique random 128 bit ID of this bus
index 3233730dbfe638e398a48085e0682e716ab1ac54..1d372767b29b200742ca6c1447581dd5339e526b 100644 (file)
@@ -1575,8 +1575,12 @@ static void __kdbus_conn_free(struct kref *kref)
 {
        struct kdbus_conn *conn = container_of(kref, struct kdbus_conn, kref);
 
-       kdbus_conn_disconnect(conn, false);
+       BUG_ON(!list_empty(&conn->msg_list));
+       BUG_ON(!list_empty(&conn->names_list));
+       BUG_ON(!list_empty(&conn->names_queue_list));
+       BUG_ON(!list_empty(&conn->reply_list));
 
+       kdbus_conn_disconnect(conn, false);
        atomic_dec(&conn->user->connections);
        kdbus_domain_user_unref(conn->user);
 
index d79db6f1debb9d16b9e8559c2a85ebde1f43daf3..90feb75a177455795d508875fdb79b98855f962d 100644 (file)
--- a/domain.c
+++ b/domain.c
@@ -158,6 +158,10 @@ static void __kdbus_domain_free(struct kref *kref)
        struct kdbus_domain *domain =
                container_of(kref, struct kdbus_domain, kref);
 
+       BUG_ON(!list_empty(&domain->domain_list));
+       BUG_ON(!list_empty(&domain->bus_list));
+       BUG_ON(!hash_empty(domain->user_hash));
+
        kdbus_domain_disconnect(domain);
        kdbus_domain_unref(domain->parent);
        kfree(domain->name);
index 7642bcd2e9f4dad580abe805c8afa3027aba249a..465ae31ec7767c0dc9fb879f2d87ea84a54a3101 100644 (file)
@@ -112,6 +112,8 @@ static void __kdbus_ep_free(struct kref *kref)
 {
        struct kdbus_ep *ep = container_of(kref, struct kdbus_ep, kref);
 
+       BUG_ON(!list_empty(&ep->conn_list));
+
        kdbus_ep_disconnect(ep);
        kdbus_policy_db_free(ep->policy_db);
        kdbus_bus_unref(ep->bus);
diff --git a/kdbus.h b/kdbus.h
index 01ef00531000ba0599a8c6692df3b58df197b11a..4258830958afb0913b28310772a2237f2a1ba6fe 100644 (file)
--- a/kdbus.h
+++ b/kdbus.h
@@ -507,6 +507,7 @@ enum kdbus_hello_flags {
  * @KDBUS_ATTACH_SECLABEL:     The security label
  * @KDBUS_ATTACH_AUDIT:                The audit IDs
  * @KDBUS_ATTACH_CONN_NAME:    The human-readable connection name
+ * @_KDBUS_ATTACH_ALL:         All of the above
  */
 enum kdbus_attach_flags {
        KDBUS_ATTACH_TIMESTAMP          =  1 <<  0,
index 2c9abbf601dbe6b62a6354a04820fc255fcf00dc..a9ff07b99bfd92092c844c08b8a6468cc1413df2 100644 (file)
--- a/policy.h
+++ b/policy.h
@@ -50,5 +50,4 @@ int kdbus_policy_set(struct kdbus_policy_db *db,
                     size_t max_policies,
                     bool allow_wildcards,
                     const void *owner);
-
 #endif