goto exit_ep_unref;
}
+ /* link into domain */
+ mutex_lock(&domain->lock);
+ if (domain->disconnected) {
+ ret = -ESHUTDOWN;
+ goto exit_unlock;
+ }
+
if (!capable(CAP_IPC_OWNER) &&
atomic_inc_return(&b->user->buses) > KDBUS_USER_MAX_BUSES) {
atomic_dec(&b->user->buses);
ret = -EMFILE;
- goto exit_user_unref;
+ goto exit_unlock;
}
- /* 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);
*bus = b;
return 0;
+exit_unlock:
+ mutex_unlock(&domain->lock);
exit_user_unref:
kdbus_domain_user_unref(b->user);
exit_ep_unref:
goto exit_free_meta;
}
- if (!capable(CAP_IPC_OWNER) &&
- atomic_inc_return(&conn->user->connections) > KDBUS_USER_MAX_CONN) {
- atomic_dec(&conn->user->connections);
- ret = -EMFILE;
- goto exit_unref_user;
- }
-
/* lock order: domain -> bus -> ep -> names -> conn */
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;
+ goto exit_unlock;
+ }
+
+ if (!capable(CAP_IPC_OWNER) &&
+ atomic_inc_return(&conn->user->connections) > KDBUS_USER_MAX_CONN) {
+ atomic_dec(&conn->user->connections);
+ ret = -EMFILE;
+ goto exit_unlock;
}
/* link into bus and endpoint */
*c = conn;
return 0;
+exit_unlock:
+ mutex_unlock(&ep->lock);
+ mutex_unlock(&bus->lock);
exit_unref_user:
kdbus_domain_user_unref(conn->user);
exit_free_meta: