]> git.proxmox.com Git - mirror_qemu.git/commitdiff
slirp: Propagate host TCP RST to the guest.
authorEdgar E. Iglesias <edgar.iglesias@gmail.com>
Thu, 7 Apr 2016 05:04:43 +0000 (22:04 -0700)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Thu, 7 Apr 2016 11:01:45 +0000 (13:01 +0200)
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>
slirp/socket.c

index 7f022a676992b72936aa32a7b95f3ceb231ad9c6..0d67b126781f3bb99c020d02fe01a1e959c14cc4 100644 (file)
@@ -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;
                }
        }