Stefano Garzarella
2022-Feb-17 14:30 UTC
[PATCH v2] vsock: remove vsock from connected table when connect is interrupted by a signal
On Thu, Feb 17, 2022 at 08:13:12AM -0600, Seth Forshee wrote:>vsock_connect() expects that the socket could already be in the >TCP_ESTABLISHED state when the connecting task wakes up with a signal >pending. If this happens the socket will be in the connected table, and >it is not removed when the socket state is reset. In this situation it's >common for the process to retry connect(), and if the connection is >successful the socket will be added to the connected table a second >time, corrupting the list. > >Prevent this by calling vsock_remove_connected() if a signal is received >while waiting for a connection. This is harmless if the socket is not in >the connected table, and if it is in the table then removing it will >prevent list corruption from a double add. > >Note for backporting: this patch requires d5afa82c977e ("vsock: correct >removal of socket from the list"), which is in all current stable trees >except 4.9.y. > >Fixes: d021c344051a ("VSOCK: Introduce VM Sockets") >Signed-off-by: Seth Forshee <sforshee at digitalocean.com> >--- >v2: Add Fixes tag and backporting notes. >--- > net/vmw_vsock/af_vsock.c | 1 + > 1 file changed, 1 insertion(+) > >diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c >index 3235261f138d..38baeb189d4e 100644 >--- a/net/vmw_vsock/af_vsock.c >+++ b/net/vmw_vsock/af_vsock.c >@@ -1401,6 +1401,7 @@ static int vsock_connect(struct socket *sock, struct sockaddr *addr, > sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE; > sock->state = SS_UNCONNECTED; > vsock_transport_cancel_pkt(vsk); >+ vsock_remove_connected(vsk); > goto out_wait; > } else if (timeout == 0) { > err = -ETIMEDOUT; >-- >2.32.0 >Reviewed-by: Stefano Garzarella <sgarzare at redhat.com>