Messages in this thread | | | Date | Mon, 21 Jun 2021 12:02:22 +0200 | From | Stefano Garzarella <> | Subject | Re: [PATCH v2] vsock: notify server to shutdown when client has pending signal |
| |
On Mon, Jun 21, 2021 at 02:26:01PM +0800, Longpeng(Mike) wrote: >The client's sk_state will be set to TCP_ESTABLISHED if the server >replay the client's connect request. > >However, if the client has pending signal, its sk_state will be set >to TCP_CLOSE without notify the server, so the server will hold the >corrupt connection. > > client server > >1. sk_state=TCP_SYN_SENT | >2. call ->connect() | >3. wait reply | > | 4. sk_state=TCP_ESTABLISHED > | 5. insert to connected list > | 6. reply to the client >7. sk_state=TCP_ESTABLISHED | >8. insert to connected list | >9. *signal pending* <--------------------- the user kill client >10. sk_state=TCP_CLOSE | >client is exiting... | >11. call ->release() | > virtio_transport_close > if (!(sk->sk_state == TCP_ESTABLISHED || > sk->sk_state == TCP_CLOSING)) > return true; *return at here, the server cannot notice the connection is corrupt* > >So the client should notify the peer in this case. > >Cc: David S. Miller <davem@davemloft.net> >Cc: Jakub Kicinski <kuba@kernel.org> >Cc: Jorgen Hansen <jhansen@vmware.com> >Cc: Norbert Slusarek <nslusarek@gmx.net> >Cc: Andra Paraschiv <andraprs@amazon.com> >Cc: Colin Ian King <colin.king@canonical.com> >Cc: David Brazdil <dbrazdil@google.com> >Cc: Alexander Popov <alex.popov@linux.com> >Suggested-by: Stefano Garzarella <sgarzare@redhat.com> >Link: https://lkml.org/lkml/2021/5/17/418 >Signed-off-by: lixianming <lixianming5@huawei.com> >Signed-off-by: Longpeng(Mike) <longpeng2@huawei.com> >--- > net/vmw_vsock/af_vsock.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > >diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c >index 92a72f0..ae11311 100644 >--- a/net/vmw_vsock/af_vsock.c >+++ b/net/vmw_vsock/af_vsock.c >@@ -1369,7 +1369,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, > > if (signal_pending(current)) { > err = sock_intr_errno(timeout); >- sk->sk_state = TCP_CLOSE; >+ sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE; > sock->state = SS_UNCONNECTED; > vsock_transport_cancel_pkt(vsk); > goto out_wait; >-- >1.8.3.1 >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
| |