slirp: handle deferred ECONNREFUSED on non-blocking TCP sockets
authorSteven Luo <steven+qemu@steven676.net>
Thu, 7 Apr 2016 05:04:55 +0000 (22:04 -0700)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Thu, 7 Apr 2016 11:02:05 +0000 (13:02 +0200)
slirp currently only handles ECONNREFUSED in the case where connect()
returns immediately with that error; since we use non-blocking sockets,
most of the time we won't receive the error until we later try to read
from the socket.  Ensure that we deliver the appropriate RST to the
guest in this case.

Signed-off-by: Steven Luo <steven+qemu@steven676.net>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
slirp/socket.c
slirp/tcp_input.c

index 0d67b126781f3bb99c020d02fe01a1e959c14cc4..bd97b2d682fe190c96b8fa399903199e6a683a74 100644 (file)
@@ -188,7 +188,7 @@ soread(struct socket *so)
                        DEBUG_MISC((dfd, " --- soread() disconnected, nn = %d, errno = %d-%s\n", nn, errno,strerror(errno)));
                        sofcantrcvmore(so);
 
-                       if (err == ECONNRESET
+                       if (err == ECONNRESET || err == ECONNREFUSED
                            || err == ENOTCONN || err == EPIPE) {
                                tcp_drop(sototcpcb(so), err);
                        } else {
index 1fcca3040e8953b3728f8677708a9c5d4f83e31e..5433e7fe9c07e7aeed8c2100622ce0407c9312bf 100644 (file)
@@ -725,6 +725,12 @@ findso:
            so->so_ti = ti;
            tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
            tp->t_state = TCPS_SYN_RECEIVED;
+           /*
+            * Initialize receive sequence numbers now so that we can send a
+            * valid RST if the remote end rejects our connection.
+            */
+           tp->irs = ti->ti_seq;
+           tcp_rcvseqinit(tp);
            tcp_template(tp);
          }
          return;