RE: [PATCH 2/2] vsock: fix possible infinite sleep in vsock_connectible_wait_data()
From: Dexuan Cui
Date: Mon Oct 31 2022 - 21:58:34 EST
> From: Stefano Garzarella <sgarzare@xxxxxxxxxx>
> Sent: Monday, October 31, 2022 1:43 AM
> ...
> s/qeuue/queue
Will fix this.
> >@@ -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) ||
> >@@ -1937,6 +1940,8 @@ static int vsock_connectible_wait_data(struct sock
> *sk,
> > err = -EAGAIN;
> > break;
> > }
> >+
> >+ finish_wait(sk_sleep(sk), wait);
>
> Since we are going to call again prepare_to_wait() on top of the loop,
> is finish_wait() call here really needed?
It's not needed. Will remove this and send v2.
> What about following what we do in vsock_accept and vsock_connect?
>
> prepare_to_wait()
>
> while (condition) {
> ...
> prepare_to_wait();
> }
>
> finish_wait()
>
> I find it a little more readable, but your solution is fine too.
>
> Thanks,
> Stefano
I'd like to stay with my version, as it only needs one line of
prepare_to_wait(), and IMO it's more readable if we only exit from
inside the while loop.