mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-11-03 03:21:40 +00:00
50 lines
1.6 KiB
Diff
50 lines
1.6 KiB
Diff
From eede177e637798f2fef330fd85d9f231f5342f11 Mon Sep 17 00:00:00 2001
|
|
From: Dexuan Cui <decui@microsoft.com>
|
|
Date: Fri, 19 May 2017 21:49:59 +0800
|
|
Subject: [PATCH 12/20] hvsock: fix vsock_dequeue/enqueue_accept race
|
|
|
|
Signed-off-by: Dexuan Cui <decui@microsoft.com>
|
|
Origin: git@github.com:dcui/linux.git
|
|
(cherry picked from commit a2c08e77b8ceb1f146cdc5136e85e7a4c2c9b7cb)
|
|
---
|
|
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 6f7f6757ceef..717db396f59e 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.13.0
|
|
|