patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
94 lines
3.1 KiB
Diff
94 lines
3.1 KiB
Diff
Index: sys/netinet/tcp.h
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/sys/netinet/tcp.h,v
|
|
retrieving revision 1.40
|
|
diff -p -u -I__FBSDID -I$FreeBSD -r1.40 tcp.h
|
|
--- sys/netinet/tcp.h 25 May 2007 21:28:49 -0000 1.40
|
|
+++ sys/netinet/tcp.h 18 Jun 2008 05:36:20 -0000
|
|
@@ -78,6 +78,8 @@ struct tcphdr {
|
|
|
|
#define TCPOPT_EOL 0
|
|
#define TCPOLEN_EOL 1
|
|
+#define TCPOPT_PAD 0 /* padding after EOL */
|
|
+#define TCPOLEN_PAD 1
|
|
#define TCPOPT_NOP 1
|
|
#define TCPOLEN_NOP 1
|
|
#define TCPOPT_MAXSEG 2
|
|
Index: sys/netinet/tcp_output.c
|
|
===================================================================
|
|
RCS file: /home/ncvs/src/sys/netinet/tcp_output.c,v
|
|
retrieving revision 1.141.2.3
|
|
diff -p -u -I__FBSDID -I$FreeBSD -r1.141.2.3 tcp_output.c
|
|
--- sys/netinet/tcp_output.c 5 Dec 2007 10:37:17 -0000 1.141.2.3
|
|
+++ sys/netinet/tcp_output.c 18 Jun 2008 05:36:21 -0000
|
|
@@ -1280,12 +1280,16 @@ tcp_addoptions(struct tcpopt *to, u_char
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
@@ -1386,9 +1396,15 @@ tcp_addoptions(struct tcpopt *to, u_char
|
|
optlen += TCPOLEN_EOL;
|
|
*optp++ = TCPOPT_EOL;
|
|
}
|
|
+ /*
|
|
+ * According to RFC 793 (STD0007):
|
|
+ * "The content of the header beyond the End-of-Option option
|
|
+ * must be header padding (i.e., zero)."
|
|
+ * and later: "The padding is composed of zeros."
|
|
+ */
|
|
while (optlen % 4) {
|
|
- optlen += TCPOLEN_NOP;
|
|
- *optp++ = TCPOPT_NOP;
|
|
+ optlen += TCPOLEN_PAD;
|
|
+ *optp++ = TCPOPT_PAD;
|
|
}
|
|
|
|
KASSERT(optlen <= TCP_MAXOLEN, ("%s: TCP options too long", __func__));
|