mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-21 11:13:30 +00:00
pf: Fix possible incorrect IPv6 fragmentation
When forwarding pf tracks the size of the largest fragment in a fragmented packet, and refragments based on this size. It failed to ensure that this size was a multiple of 8 (as is required for all but the last fragment), so it could end up generating incorrect fragments. For example, if we received an 8 byte and 12 byte fragment pf would emit a first fragment with 12 bytes of payload and the final fragment would claim to be at offset 8 (not 12). We now assert that the fragment size is a multiple of 8 in ip6_fragment(), so other users won't make the same mistake. Reported by: Antonios Atlasis <aatlasis at secfu net> MFC after: 3 days
This commit is contained in:
parent
d1025db49e
commit
00eab743ab
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=317186
@ -226,6 +226,8 @@ ip6_fragment(struct ifnet *ifp, struct mbuf *m0, int hlen, u_char nextproto,
|
||||
int error;
|
||||
int tlen = m0->m_pkthdr.len;
|
||||
|
||||
KASSERT(( mtu % 8 == 0), ("Fragment length must be a multiple of 8"));
|
||||
|
||||
m = m0;
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
mnext = &m->m_nextpkt;
|
||||
|
@ -762,6 +762,10 @@ pf_refragment6(struct ifnet *ifp, struct mbuf **m0, struct m_tag *mtag)
|
||||
hdr->ip6_nxt = IPPROTO_FRAGMENT;
|
||||
}
|
||||
|
||||
/* The MTU must be a multiple of 8 bytes, or we risk doing the
|
||||
* fragmentation wrong. */
|
||||
maxlen = maxlen & ~7;
|
||||
|
||||
/*
|
||||
* Maxlen may be less than 8 if there was only a single
|
||||
* fragment. As it was fragmented before, add a fragment
|
||||
|
Loading…
Reference in New Issue
Block a user