diff options
author | Andre Oppermann <andre@FreeBSD.org> | 2008-04-07 19:09:23 +0000 |
---|---|---|
committer | Andre Oppermann <andre@FreeBSD.org> | 2008-04-07 19:09:23 +0000 |
commit | 3a4018c4e87b92d5c2ca32e0e4e949a1b811bd8f (patch) | |
tree | a001e21f4e03a25a91c9d9e8ae6600bc995818df /sys/netinet/tcp_output.c | |
parent | 5b2e33eab5841b63f4c84f926b5513d5de52da15 (diff) | |
download | src-3a4018c4e87b92d5c2ca32e0e4e949a1b811bd8f.tar.gz src-3a4018c4e87b92d5c2ca32e0e4e949a1b811bd8f.zip |
Remove TCP options ordering assumptions in tcp_addoptions(). Ordering
was changed in rev. 1.161 of tcp_var.h. All option now test for sufficient
space in TCP header before getting added.
Reported by: Mark Atkinson <atkin901-at-yahoo.com>
Tested by: Mark Atkinson <atkin901-at-yahoo.com>
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=177988
Diffstat (limited to 'sys/netinet/tcp_output.c')
-rw-r--r-- | sys/netinet/tcp_output.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index 1985359c451c..5c659a3bc1ee 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -1280,12 +1280,16 @@ tcp_addoptions(struct tcpopt *to, u_char *optp) for (mask = 1; mask < TOF_MAXOPT; mask <<= 1) { if ((to->to_flags & mask) != mask) continue; + if (optlen == TCP_MAXOLEN) + break; switch (to->to_flags & mask) { case TOF_MSS: while (optlen % 4) { optlen += TCPOLEN_NOP; *optp++ = TCPOPT_NOP; } + if (TCP_MAXOLEN - optlen < TCPOLEN_MAXSEG) + continue; optlen += TCPOLEN_MAXSEG; *optp++ = TCPOPT_MAXSEG; *optp++ = TCPOLEN_MAXSEG; @@ -1298,6 +1302,8 @@ tcp_addoptions(struct tcpopt *to, u_char *optp) optlen += TCPOLEN_NOP; *optp++ = TCPOPT_NOP; } + if (TCP_MAXOLEN - optlen < TCPOLEN_WINDOW) + continue; optlen += TCPOLEN_WINDOW; *optp++ = TCPOPT_WINDOW; *optp++ = TCPOLEN_WINDOW; @@ -1308,6 +1314,8 @@ tcp_addoptions(struct tcpopt *to, u_char *optp) optlen += TCPOLEN_NOP; *optp++ = TCPOPT_NOP; } + if (TCP_MAXOLEN - optlen < TCPOLEN_SACK_PERMITTED) + continue; optlen += TCPOLEN_SACK_PERMITTED; *optp++ = TCPOPT_SACK_PERMITTED; *optp++ = TCPOLEN_SACK_PERMITTED; @@ -1317,6 +1325,8 @@ tcp_addoptions(struct tcpopt *to, u_char *optp) optlen += TCPOLEN_NOP; *optp++ = TCPOPT_NOP; } + if (TCP_MAXOLEN - optlen < TCPOLEN_TIMESTAMP) + continue; optlen += TCPOLEN_TIMESTAMP; *optp++ = TCPOPT_TIMESTAMP; *optp++ = TCPOLEN_TIMESTAMP; @@ -1355,7 +1365,7 @@ tcp_addoptions(struct tcpopt *to, u_char *optp) optlen += TCPOLEN_NOP; *optp++ = TCPOPT_NOP; } - if (TCP_MAXOLEN - optlen < 2 + TCPOLEN_SACK) + if (TCP_MAXOLEN - optlen < TCPOLEN_SACKHDR + TCPOLEN_SACK) continue; optlen += TCPOLEN_SACKHDR; *optp++ = TCPOPT_SACK; |