doc/share/security/patches/SA-01:52/frag-4.x.patch
Bjoern A. Zeeb 3571e53040 Import FreeBSD Security Advisories and Errata Notices, as well as their
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)
2012-08-15 06:19:40 +00:00

118 lines
3.8 KiB
Diff

Index: sys/netinet/ip_input.c
===================================================================
RCS file: /mnt/ncvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.130.2.21
retrieving revision 1.130.2.22
diff -u -r1.130.2.21 -r1.130.2.22
--- sys/netinet/ip_input.c 2001/03/08 23:14:54 1.130.2.21
+++ sys/netinet/ip_input.c 2001/06/16 23:48:04 1.130.2.22
@@ -122,6 +122,12 @@
&ip_keepfaith, 0,
"Enable packet capture for FAITH IPv4->IPv6 translater daemon");
+static int ip_nfragpackets = 0;
+static int ip_maxfragpackets; /* initialized in ip_init() */
+SYSCTL_INT(_net_inet_ip, OID_AUTO, maxfragpackets, CTLFLAG_RW,
+ &ip_maxfragpackets, 0,
+ "Maximum number of IPv4 fragment reassembly queue entries");
+
/*
* XXX - Setting ip_checkinterface mostly implements the receive side of
* the Strong ES model described in RFC 1122, but since the routing table
@@ -248,7 +254,8 @@
for (i = 0; i < IPREASS_NHASH; i++)
ipq[i].next = ipq[i].prev = &ipq[i];
- maxnipq = nmbclusters/4;
+ maxnipq = nmbclusters / 4;
+ ip_maxfragpackets = nmbclusters / 4;
ip_id = time_second & 0xffff;
ipintrq.ifq_maxlen = ipqmaxlen;
@@ -861,6 +868,15 @@
* If first fragment to arrive, create a reassembly queue.
*/
if (fp == 0) {
+ /*
+ * Enforce upper bound on number of fragmented packets
+ * for which we attempt reassembly;
+ * If maxfrag is 0, never accept fragments.
+ * If maxfrag is -1, accept all fragments without limitation.
+ */
+ if ((ip_maxfragpackets >= 0) && (ip_nfragpackets >= ip_maxfragpackets))
+ goto dropfrag;
+ ip_nfragpackets++;
if ((t = m_get(M_DONTWAIT, MT_FTABLE)) == NULL)
goto dropfrag;
fp = mtod(t, struct ipq *);
@@ -1009,6 +1025,7 @@
remque(fp);
nipq--;
(void) m_free(dtom(fp));
+ ip_nfragpackets--;
m->m_len += (IP_VHL_HL(ip->ip_vhl) << 2);
m->m_data -= (IP_VHL_HL(ip->ip_vhl) << 2);
/* some debugging cruft by sklower, below, will go away soon */
@@ -1049,6 +1066,7 @@
}
remque(fp);
(void) m_free(dtom(fp));
+ ip_nfragpackets--;
nipq--;
}
@@ -1074,6 +1092,20 @@
if (fp->prev->ipq_ttl == 0) {
ipstat.ips_fragtimeout++;
ip_freef(fp->prev);
+ }
+ }
+ }
+ /*
+ * If we are over the maximum number of fragments
+ * (due to the limit being lowered), drain off
+ * enough to get down to the new limit.
+ */
+ for (i = 0; i < IPREASS_NHASH; i++) {
+ if (ip_maxfragpackets >= 0) {
+ while ((ip_nfragpackets > ip_maxfragpackets) &&
+ (ipq[i].next != &ipq[i])) {
+ ipstat.ips_fragdropped++;
+ ip_freef(ipq[i].next);
}
}
}
Index: sys/netinet6/frag6.c
===================================================================
RCS file: /mnt/ncvs/src/sys/netinet6/frag6.c,v
retrieving revision 1.2.2.3
retrieving revision 1.2.2.4
diff -u -r1.2.2.3 -r1.2.2.4
--- sys/netinet6/frag6.c 2001/05/23 09:47:24 1.2.2.3
+++ sys/netinet6/frag6.c 2001/06/16 23:48:11 1.2.2.4
@@ -81,6 +81,8 @@
{
struct timeval tv;
+ ip6_maxfragpackets = nmbclusters / 4;
+
/*
* in many cases, random() here does NOT return random number
* as initialization during bootstrap time occur in fixed order.
Index: sys/netinet6/in6_proto.c
===================================================================
RCS file: /mnt/ncvs/src/sys/netinet6/in6_proto.c,v
retrieving revision 1.6.2.3
retrieving revision 1.6.2.4
diff -u -r1.6.2.3 -r1.6.2.4
--- sys/netinet6/in6_proto.c 2001/03/05 13:09:04 1.6.2.3
+++ sys/netinet6/in6_proto.c 2001/06/16 23:48:11 1.6.2.4
@@ -286,7 +286,7 @@
int ip6_defhlim = IPV6_DEFHLIM;
int ip6_defmcasthlim = IPV6_DEFAULT_MULTICAST_HOPS;
int ip6_accept_rtadv = 0; /* "IPV6FORWARDING ? 0 : 1" is dangerous */
-int ip6_maxfragpackets = 200;
+int ip6_maxfragpackets; /* initialized in frag6.c:frag6_init() */
int ip6_log_interval = 5;
int ip6_hdrnestlimit = 50; /* appropriate? */
int ip6_dad_count = 1; /* DupAddrDetectionTransmits */