The pf code marks ICMP packets belonging to an TCP or UDP divert
authorbluhm <bluhm@openbsd.org>
Thu, 14 Dec 2017 14:26:50 +0000 (14:26 +0000)
committerbluhm <bluhm@openbsd.org>
Thu, 14 Dec 2017 14:26:50 +0000 (14:26 +0000)
commit17b8cf86171e182e0d461acd987663ede9d7d5e5
treea27f4ddf43a94b32354508b54f478f2b2938a640
parente38d2b44a40bbf911fa9bf913fbed33e0e9c556d
The pf code marks ICMP packets belonging to an TCP or UDP divert
state as diverted.  This is necessary for IP input to accept the
packet as ours.  But it must not be used to match the ICMP packet
to a raw socket.  Clear the PF_TAG_DIVERTED mbuf pf flag for the
special ICMP and ICMP6 packets in icmp_input_if() and icmp6_input().

The m_tag_delete_chain() caused an inconsistent PF_TAG_DIVERTED
mbuf pf flag and PACKET_TAG_PF_DIVERT mbuf tag which triggered an
assert in rip_input().  Deleting all mbuf tags can have undesired
side effects and is not necessary anymore since icmp_reflect() calls
m_resethdr().  Do not touch the mbuf tags and adjust the mbuf pf
flags for the correct behavior of rip_input() and rip6_input().

reported by Chris Eidem, James Turner, vicviq, Scott Vanderbilt
OK mpi@
sys/netinet/ip_icmp.c
sys/netinet6/icmp6.c