After vsock_connect() exits the wait loop due to sk->sk_err being
set, the error was read but not cleared. This left sk->sk_err set
for subsequent operations.
Switch to sock_error() which atomically reads and clears sk->sk_err,
so the error is consumed when returned.

Signed-off-by: Nguyen Dinh Phi <[email protected]>
Reported-by: [email protected]
---
 net/vmw_vsock/af_vsock.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index 622dbd046799..43eddc33ed12 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -1847,14 +1847,11 @@ static int vsock_connect(struct socket *sock, struct 
sockaddr_unsized *addr,
                prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
        }
 
-       if (sk->sk_err) {
-               err = -sk->sk_err;
+       err = sock_error(sk);
+       if (err) {
                sk->sk_state = TCP_CLOSE;
                sock->state = SS_UNCONNECTED;
-       } else {
-               err = 0;
        }
-
 out_wait:
        finish_wait(sk_sleep(sk), &wait);
 out:
-- 
2.53.0


Reply via email to