From 27d92ebc5ed1bb0b518d0ebc4c609182ad20a799 Mon Sep 17 00:00:00 2001 From: "Edgar E. Iglesias" Date: Wed, 6 Apr 2016 22:04:43 -0700 Subject: slirp: Propagate host TCP RST to the guest. When the host aborts (RST) its side of a TCP connection we need to propagate that RST to the guest. The current code can leave such guest connections dangling forever. Spotted by Jason Wessel. Signed-off-by: Edgar E. Iglesias [steven@steven676.net: coding style adjustments] Signed-off-by: Steven Luo Signed-off-by: Samuel Thibault --- slirp/socket.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'slirp') diff --git a/slirp/socket.c b/slirp/socket.c index 7f022a6769..0d67b12678 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -176,9 +176,24 @@ soread(struct socket *so) if (nn < 0 && (errno == EINTR || errno == EAGAIN)) return 0; else { + int err; + socklen_t slen = sizeof err; + + err = errno; + if (nn == 0) { + getsockopt(so->s, SOL_SOCKET, SO_ERROR, + &err, &slen); + } + DEBUG_MISC((dfd, " --- soread() disconnected, nn = %d, errno = %d-%s\n", nn, errno,strerror(errno))); sofcantrcvmore(so); - tcp_sockclosed(sototcpcb(so)); + + if (err == ECONNRESET + || err == ENOTCONN || err == EPIPE) { + tcp_drop(sototcpcb(so), err); + } else { + tcp_sockclosed(sototcpcb(so)); + } return -1; } } -- cgit v1.2.1