return conn->type != KDBUS_CONN_DISCONNECTED;
}
+/**
+ * kdbus_conn_flush_policy() - flush all cached policy entries that
+ * refer to a connecion
+ * @conn: Connection to check
+ */
+void kdbus_conn_flush_policy(struct kdbus_conn *conn)
+{
+ if (conn->ep->policy_db)
+ kdbus_policy_remove_conn(conn->ep->policy_db, conn);
+
+ if (conn->bus->policy_db)
+ kdbus_policy_remove_conn(conn->bus->policy_db, conn);
+}
+
static void __kdbus_conn_free(struct kref *kref)
{
struct kdbus_conn *conn = container_of(kref, struct kdbus_conn, kref);
atomic_dec(&conn->user->connections);
kdbus_domain_user_unref(conn->user);
- if (conn->ep->policy_db)
- kdbus_policy_remove_conn(conn->ep->policy_db, conn);
+ kdbus_conn_flush_policy(conn);
- if (conn->bus->policy_db) {
- kdbus_policy_remove_conn(conn->bus->policy_db, conn);
+ if (conn->bus->policy_db)
kdbus_policy_remove_owner(conn->bus->policy_db, conn);
- }
kdbus_meta_free(conn->owner_meta);
kdbus_match_db_free(conn->match_db);
struct kdbus_conn *kdbus_conn_unref(struct kdbus_conn *conn);
int kdbus_conn_disconnect(struct kdbus_conn *conn, bool ensure_queue_empty);
bool kdbus_conn_active(const struct kdbus_conn *conn);
+void kdbus_conn_flush_policy(struct kdbus_conn *conn);
int kdbus_cmd_msg_recv(struct kdbus_conn *conn,
struct kdbus_cmd_recv *recv);
}
}
+ /*
+ * Now that the connection has lost a name, purge all cached policy
+ * entries, so upon the next message, TALK access will be checked
+ * against the names the connection actually owns.
+ */
+ if (ret == 0)
+ kdbus_conn_flush_policy(conn);
+
exit_unlock:
up_write(®->rwlock);
mutex_unlock(&conn->bus->lock);