summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mack <zonque@gmail.com>2013-12-03 14:54:22 +0100
committerDaniel Mack <zonque@gmail.com>2013-12-03 14:54:22 +0100
commit61a8b1cc780ae75256ef24b264c19b3ed5e19138 (patch)
tree57f8b8c1745bcd632c250c6b828a66633331b58e
parent340e97646a6270e40ed2cbfb8c112a06f7ee1a6a (diff)
downloadkdbus-bus-61a8b1cc780ae75256ef24b264c19b3ed5e19138.tar.gz
kdbus-bus-61a8b1cc780ae75256ef24b264c19b3ed5e19138.tar.bz2
kdbus-bus-61a8b1cc780ae75256ef24b264c19b3ed5e19138.zip
connection: access 'disconnected' under lock
-rw-r--r--connection.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/connection.c b/connection.c
index 3e32ef4cd4c..d55de245003 100644
--- a/connection.c
+++ b/connection.c
@@ -506,6 +506,7 @@ static int kdbus_conn_get_conn_dst(struct kdbus_bus *bus,
{
const struct kdbus_msg *msg = &kmsg->msg;
struct kdbus_conn *c;
+ bool disconnected;
int ret = 0;
mutex_lock(&bus->lock);
@@ -547,7 +548,11 @@ static int kdbus_conn_get_conn_dst(struct kdbus_bus *bus,
}
}
- if (c->disconnected) {
+ mutex_lock(&c->lock);
+ disconnected = c->disconnected;
+ mutex_unlock(&c->lock);
+
+ if (disconnected) {
ret = -ESRCH;
goto exit_unlock;
}
@@ -848,9 +853,14 @@ void kdbus_conn_disconnect(struct kdbus_conn *conn)
struct kdbus_conn_queue *queue, *tmp;
struct list_head list;
- if (conn->disconnected)
+ mutex_lock(&conn->lock);
+ if (conn->disconnected) {
+ mutex_unlock(&conn->lock);
return;
+ }
+
conn->disconnected = true;
+ mutex_unlock(&conn->lock);
/* remove from bus */
mutex_lock(&conn->ep->bus->lock);