/* link into domain */
mutex_lock(&domain->lock);
+ if (domain->disconnected) {
+ mutex_unlock(&domain->lock);
+ ret = -ESHUTDOWN;
+ goto exit_user_unref;
+ }
b->id = ++domain->bus_seq_last;
list_add_tail(&b->domain_entry, &domain->bus_list);
mutex_unlock(&domain->lock);
/* allocate the needed space in the pool of the receiver */
mutex_lock(&conn->lock);
- if (conn->disconnected) {
+ if (!kdbus_conn_active(conn)) {
ret = -ECONNRESET;
goto exit_unlock;
}
conn = container_of(work, struct kdbus_conn, work.work);
mutex_lock(&conn->lock);
- if (unlikely(conn->disconnected)) {
+ if (!kdbus_conn_active(conn)) {
mutex_unlock(&conn->lock);
return;
}
LIST_HEAD(reply_list);
mutex_lock(&conn->lock);
- if (conn->disconnected) {
+ if (!kdbus_conn_active(conn)) {
mutex_unlock(&conn->lock);
return -EALREADY;
}
cancel_delayed_work_sync(&conn->work);
- /* remove from bus */
+ /* remove from bus and endpoint */
mutex_lock(&conn->bus->lock);
+ mutex_lock(&conn->ep->lock);
hash_del(&conn->hentry);
list_del(&conn->monitor_entry);
- mutex_unlock(&conn->bus->lock);
-
- /* remove from endpoint */
- mutex_lock(&conn->ep->lock);
list_del(&conn->ep_entry);
mutex_unlock(&conn->ep->lock);
+ mutex_unlock(&conn->bus->lock);
/* if we die while other connections wait for our reply, notify them */
mutex_lock(&conn->lock);
goto exit_unref_user;
}
- /* link into endpoint */
+ /* link into bus and endpoint */
+ mutex_lock(&bus->lock);
mutex_lock(&ep->lock);
+ if (bus->disconnected || ep->disconnected) {
+ mutex_unlock(&ep->lock);
+ mutex_unlock(&bus->lock);
+ ret = -ESHUTDOWN;
+ goto exit_unref_user;
+ }
list_add_tail(&conn->ep_entry, &ep->conn_list);
- mutex_unlock(&ep->lock);
-
- /* link into bus */
- mutex_lock(&bus->lock);
hash_add(bus->conn_hash, &conn->hentry, conn->id);
+ mutex_unlock(&ep->lock);
mutex_unlock(&bus->lock);
*c = conn;
atomic64_set(&d->msg_seq_last, 0);
idr_init(&d->user_idr);
- if (parent)
+ if (parent) {
mutex_lock(&parent->lock);
+ if (parent->disconnected) {
+ mutex_unlock(&parent->lock);
+ return -ESHUTDOWN;
+ }
+ }
+
mutex_lock(&kdbus_subsys_lock);
/* compose name and path of base directory in /dev */
/* link into domain */
mutex_lock(&domain->lock);
+ if (domain->disconnected) {
+ mutex_unlock(&domain->lock);
+ kfree(u);
+ return NULL;
+ }
/*
* Allocate the smallest possible index for this user; used
/* link into bus */
mutex_lock(&bus->lock);
+ if (bus->disconnected) {
+ mutex_unlock(&bus->lock);
+ ret = -ESHUTDOWN;
+ goto exit_dev_unregister;
+ }
e->id = ++bus->ep_seq_last;
e->bus = kdbus_bus_ref(bus);
list_add_tail(&e->bus_entry, &bus->ep_list);