qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] slirp: Propagate host TCP RST packet to the gue


From: Samuel Thibault
Subject: Re: [Qemu-devel] [PATCH] slirp: Propagate host TCP RST packet to the guest after socket disconnected
Date: Thu, 30 Aug 2018 18:02:24 +0200
User-agent: NeoMutt/20170113 (1.7.2)

Hello,

The principle seems sane, I'll have a look.

Thanks,
Samuel

Gavin Grant, le jeu. 30 août 2018 16:57:57 +0100, a ecrit:
> Commit 27d92ebc5ed1bb0b518d0ebc4c609182ad20a799 handled the case where the TCP
> connection is abruptly closed via a RST packet, by checking for the ECONNRESET
> errno. However it does not consider the case where the connection has been
> half-closed by the host (FIN/ACK), then the host socket is disconnected. For
> example, if the host application calls close() on the socket, then the
> application exits.
> 
> In this case, the socket still exists due to the file descriptor in SLIRP, but
> it is disconnected. recv() does not indicate an error since an orderly socket
> close has previously occurred. The socket will then be stuck in FIN_WAIT_2,
> until the peer sends FIN/ACK or a timeout occurs. Instead we can send a RST
> to the peer and transition to the CLOSED state.
> 
> Signed-off-by: Gavin Grant <address@hidden>
> ---
>  slirp/socket.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/slirp/socket.c b/slirp/socket.c
> index 08fe98907d..543bd5feaf 100644
> --- a/slirp/socket.c
> +++ b/slirp/socket.c
> @@ -204,12 +204,17 @@ soread(struct socket *so)
>                       return 0;
>               else {
>                       int err;
> +                     struct sockaddr addr;
>                       socklen_t slen = sizeof err;
>  
>                       err = errno;
>                       if (nn == 0) {
> -                             getsockopt(so->s, SOL_SOCKET, SO_ERROR,
> -                                        &err, &slen);
> +                             if (getpeername(so->s, &addr, &slen) < 0) {
> +                                     err = errno;
> +                             } else {
> +                                     getsockopt(so->s, SOL_SOCKET, SO_ERROR,
> +                                             &err, &slen);
> +                             }
>                       }
>  
>                       DEBUG_MISC((dfd, " --- soread() disconnected, nn = %d, 
> errno = %d-%s\n", nn, errno,strerror(errno)));
> -- 
> 2.11.0
> 

-- 
Samuel
***e trouve un .xls
***e passe un moment à se demander quelle version de xml c'est ça, le .xls
e: donc j'ai fait un file....
 -+- #sos - on n'a pas forcément les mêmes références que tout le monde -+-



reply via email to

[Prev in Thread] Current Thread [Next in Thread]