aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTao Wu <lepton@google.com>2017-11-08 14:53:40 -0800
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2017-11-09 18:59:22 +0100
commitaa0c5f6a3ce7a611413b0b61e0cc4044ccb5cc84 (patch)
tree388e9c41bbc2997bd5a49564d8386d071ab9adda
parent8466b7dbe5479728a6f7084677129f6fe53f365c (diff)
downloadslirp-aa0c5f6a3ce7a611413b0b61e0cc4044ccb5cc84.zip
slirp-aa0c5f6a3ce7a611413b0b61e0cc4044ccb5cc84.tar.gz
slirp-aa0c5f6a3ce7a611413b0b61e0cc4044ccb5cc84.tar.bz2
98c63057d2144fb81681580cd84c13c93794c96e ('slirp: Factorizing tcpiphdr structure with an union') introduced a memset call to clear possibly-undefined fields in ti. This however overwrites src/dst/pr which are used below. So let us clear only the unused fields. This should fix some rare cases (some RST cases, keep alive probes) where packets would be sent to 0.0.0.0. Signed-off-by: Tao Wu <lepton@google.com> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
-rw-r--r--tcp_subr.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/tcp_subr.c b/tcp_subr.c
index 59f61fc..d72597c 100644
--- a/tcp_subr.c
+++ b/tcp_subr.c
@@ -145,7 +145,16 @@ void tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m,
m->m_data += IF_MAXLINKHDR;
*mtod(m, struct tcpiphdr *) = *ti;
ti = mtod(m, struct tcpiphdr *);
- memset(&ti->ti, 0, sizeof(ti->ti));
+ switch (af) {
+ case AF_INET:
+ ti->ti.ti_i4.ih_x1 = 0;
+ break;
+ case AF_INET6:
+ ti->ti.ti_i6.ih_x1 = 0;
+ break;
+ default:
+ g_assert_not_reached();
+ }
flags = TH_ACK;
} else {
/*