diff options
author | Edgar E. Iglesias <edgar.iglesias@gmail.com> | 2016-04-06 22:04:43 -0700 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-04-07 13:01:45 +0200 |
commit | cc7b3257e0fff82542174c41e599d171244b0ee2 (patch) | |
tree | c668f579e1dd4de9d5b09c2d20f020dacc3e22f6 | |
parent | cbe476c8f001e1757c8fcd7f49ee7b51caf4e0da (diff) | |
download | slirp-cc7b3257e0fff82542174c41e599d171244b0ee2.zip slirp-cc7b3257e0fff82542174c41e599d171244b0ee2.tar.gz slirp-cc7b3257e0fff82542174c41e599d171244b0ee2.tar.bz2 |
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>
-rw-r--r-- | socket.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -175,11 +175,24 @@ int 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; } } |