[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <KL1P15301MB00082249964D8EF1BAA48790BF8D0@KL1P15301MB0008.APCP153.PROD.OUTLOOK.COM>
Date: Tue, 15 Aug 2017 22:15:39 +0000
From: Dexuan Cui <decui@...rosoft.com>
To: "davem@...emloft.net" <davem@...emloft.net>,
"netdev@...r.kernel.org" <netdev@...r.kernel.org>
CC: "'gregkh@...uxfoundation.org'" <'gregkh@...uxfoundation.org'>,
"devel@...uxdriverproject.org" <devel@...uxdriverproject.org>,
KY Srinivasan <kys@...rosoft.com>,
Haiyang Zhang <haiyangz@...rosoft.com>,
"Stephen Hemminger" <sthemmin@...rosoft.com>,
George Zhang <georgezhang@...are.com>,
Jorgen Hansen <jhansen@...are.com>,
Michal Kubecek <mkubecek@...e.cz>,
"Asias He" <asias@...hat.com>,
Stefan Hajnoczi <stefanha@...hat.com>,
"Vitaly Kuznetsov" <vkuznets@...hat.com>,
Cathy Avery <cavery@...hat.com>,
"jasowang@...hat.com" <jasowang@...hat.com>,
Rolf Neugebauer <rolf.neugebauer@...ker.com>,
Dave Scott <dave.scott@...ker.com>,
"Marcelo Cerri" <marcelo.cerri@...onical.com>,
"apw@...onical.com" <apw@...onical.com>,
"olaf@...fle.de" <olaf@...fle.de>,
"joe@...ches.com" <joe@...ches.com>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
Dan Carpenter <dan.carpenter@...cle.com>
Subject: [PATCH net-next 2/3] vsock: fix vsock_dequeue/enqueue_accept race
With the current code, when vsock_dequeue_accept() is removing a sock
from the list, nothing prevents vsock_enqueue_accept() from adding a new
sock into the list concurrently. We should add a lock to protect the list.
Signed-off-by: Dexuan Cui <decui@...rosoft.com>
Cc: Andy King <acking@...are.com>
Cc: Dmitry Torokhov <dtor@...are.com>
Cc: George Zhang <georgezhang@...are.com>
Cc: Jorgen Hansen <jhansen@...are.com>
Cc: Reilly Grant <grantr@...are.com>
Cc: Asias He <asias@...hat.com>
Cc: Stefan Hajnoczi <stefanha@...hat.com>
Cc: Vitaly Kuznetsov <vkuznets@...hat.com>
Cc: Cathy Avery <cavery@...hat.com>
Cc: K. Y. Srinivasan <kys@...rosoft.com>
Cc: Haiyang Zhang <haiyangz@...rosoft.com>
Cc: Stephen Hemminger <sthemmin@...rosoft.com>
---
net/vmw_vsock/af_vsock.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index dfc8c51e..b7b2c66 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -126,6 +126,7 @@ static struct proto vsock_proto = {
static const struct vsock_transport *transport;
static DEFINE_MUTEX(vsock_register_mutex);
+static DEFINE_SPINLOCK(vsock_accept_queue_lock);
/**** EXPORTS ****/
@@ -406,7 +407,10 @@ void vsock_enqueue_accept(struct sock *listener, struct sock *connected)
sock_hold(connected);
sock_hold(listener);
+
+ spin_lock(&vsock_accept_queue_lock);
list_add_tail(&vconnected->accept_queue, &vlistener->accept_queue);
+ spin_unlock(&vsock_accept_queue_lock);
}
EXPORT_SYMBOL_GPL(vsock_enqueue_accept);
@@ -423,7 +427,10 @@ static struct sock *vsock_dequeue_accept(struct sock *listener)
vconnected = list_entry(vlistener->accept_queue.next,
struct vsock_sock, accept_queue);
+ spin_lock(&vsock_accept_queue_lock);
list_del_init(&vconnected->accept_queue);
+ spin_unlock(&vsock_accept_queue_lock);
+
sock_put(listener);
/* The caller will need a reference on the connected socket so we let
* it call sock_put().
--
2.7.4
Powered by blists - more mailing lists