]> git.baikalelectronics.ru Git - kernel.git/commitdiff
vsock: fix possible infinite sleep in vsock_connectible_wait_data()
authorDexuan Cui <decui@microsoft.com>
Tue, 1 Nov 2022 02:17:06 +0000 (19:17 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 3 Nov 2022 09:49:29 +0000 (10:49 +0100)
Currently vsock_connectible_has_data() may miss a wakeup operation
between vsock_connectible_has_data() == 0 and the prepare_to_wait().

Fix the race by adding the process to the wait queue before checking
vsock_connectible_has_data().

Fixes: af180909a41f ("af_vsock: separate wait data loop")
Signed-off-by: Dexuan Cui <decui@microsoft.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Reported-by: Frédéric Dalleau <frederic.dalleau@docker.com>
Tested-by: Frédéric Dalleau <frederic.dalleau@docker.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/vmw_vsock/af_vsock.c

index d258fd43092ef0d301eadc51c7e0993a4593ae99..884eca7f6743ae16b6d32cdcf845ac8abf743665 100644 (file)
@@ -1905,8 +1905,11 @@ static int vsock_connectible_wait_data(struct sock *sk,
        err = 0;
        transport = vsk->transport;
 
-       while ((data = vsock_connectible_has_data(vsk)) == 0) {
+       while (1) {
                prepare_to_wait(sk_sleep(sk), wait, TASK_INTERRUPTIBLE);
+               data = vsock_connectible_has_data(vsk);
+               if (data != 0)
+                       break;
 
                if (sk->sk_err != 0 ||
                    (sk->sk_shutdown & RCV_SHUTDOWN) ||