]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/commit
MFC r306289:
authorkp <kp@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Sun, 2 Oct 2016 21:11:25 +0000 (21:11 +0000)
committerkp <kp@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Sun, 2 Oct 2016 21:11:25 +0000 (21:11 +0000)
commit42df0b21aa69b8783703f39f842a66a90fe55758
tree4ddc4b039ab1cc5aa0824c49289e12b3771bb937
parent340439c3e7719f091472eea685050584c7887b78
MFC r306289:

bridge: Fix fragment handling and memory leak

Fragmented UDP and ICMP packets were corrupted if a firewall with reassembling
feature (like pf'scrub) is enabled on the bridge.  This patch fixes corrupted
packet problem and the panic (triggered easly with low RAM) as explain in PR
185633.

bridge_pfil and bridge_fragment relationship:

bridge_pfil() receive (IN direction) packets and sent it to the firewall The
firewall can be configured for reassembling fragmented packet (like pf'scrubing)
in one mbuf chain when bridge_pfil() need to send this reassembled packet to the
outgoing interface, it needs to re-fragment it by using bridge_fragment()
bridge_fragment() had to split this mbuf (using ip_fragment) first then
had to M_PREPEND each packet in the mbuf chain for adding Ethernet
header.

But M_PREPEND can sometime create a new mbuf on the begining of the mbuf chain,
then the "main" pointer of this mbuf chain should be updated and this case is
tottaly forgotten. The original bridge_fragment code (Revision 158140,
2006 April 29) came from OpenBSD, and the call to bridge_enqueue was
embedded.  But on FreeBSD, bridge_enqueue() is done after bridge_fragment(),
then the original OpenBSD code can't work as-it of FreeBSD.

PR:             185633
Submitted by:   Olivier Cochard-LabbĂ©

git-svn-id: svn://svn.freebsd.org/base/stable/10@306594 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
sys/net/if_bridge.c