summaryrefslogtreecommitdiffstats
path: root/slirp/socket.c
diff options
context:
space:
mode:
authorEdgar E. Iglesias <edgar.iglesias@gmail.com>2016-04-06 22:04:43 -0700
committerTimothy Pearson <tpearson@raptorengineering.com>2019-11-29 20:01:35 -0600
commitc9e5de4de2bc2cc3dda7e368af5f4eef8c9c607a (patch)
tree81e58b5a573ce6dd9a6b452d09f9dcf8dd342d45 /slirp/socket.c
parent2986a5798049916618841a087d46caa65f3773de (diff)
downloadhqemu-c9e5de4de2bc2cc3dda7e368af5f4eef8c9c607a.zip
hqemu-c9e5de4de2bc2cc3dda7e368af5f4eef8c9c607a.tar.gz
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 <edgar.iglesias@xilinx.com> [steven@steven676.net: coding style adjustments] Signed-off-by: Steven Luo <steven+qemu@steven676.net> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Diffstat (limited to 'slirp/socket.c')
-rw-r--r--slirp/socket.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/slirp/socket.c b/slirp/socket.c
index 7f022a6..0d67b12 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;
}
}
OpenPOWER on IntegriCloud