Reset ip_divert_ignore to zero immediately after use - also,
set it in the first place, independent of whether sin->sin_port is set. The result is that diverted packets that are being forwarded will be diverted once and only once on the way in (ip_input()) and again, once and only once on the way out (ip_output()) - twice in total. ICMP packets that don't contain a port will now also be diverted.
This commit is contained in:
parent
635b1c4908
commit
d81e40431a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=22212
@ -206,8 +206,7 @@ div_output(so, m, addr, control)
|
||||
sin = mtod(addr, struct sockaddr_in *);
|
||||
|
||||
/* Loopback avoidance option */
|
||||
if (sin && sin->sin_port)
|
||||
ip_divert_ignore = ntohs(inp->inp_lport);
|
||||
ip_divert_ignore = ntohs(inp->inp_lport);
|
||||
|
||||
/* Reinject packet into the system as incoming or outgoing */
|
||||
if (!sin || sin->sin_addr.s_addr == 0) {
|
||||
|
@ -320,6 +320,7 @@ ip_input(struct mbuf *m)
|
||||
#ifdef IPDIVERT
|
||||
action = (*ip_fw_chk_ptr)(&ip, hlen,
|
||||
m->m_pkthdr.rcvif, ip_divert_ignore, &m);
|
||||
ip_divert_ignore = 0;
|
||||
#else
|
||||
action = (*ip_fw_chk_ptr)(&ip, hlen, m->m_pkthdr.rcvif, 0, &m);
|
||||
#endif
|
||||
|
@ -355,6 +355,7 @@ ip_output(m0, opt, ro, flags, imo)
|
||||
#ifdef IPDIVERT
|
||||
action = (*ip_fw_chk_ptr)(&ip,
|
||||
hlen, ifp, (~0 << 16) | ip_divert_ignore, &m);
|
||||
ip_divert_ignore = 0;
|
||||
#else
|
||||
action = (*ip_fw_chk_ptr)(&ip, hlen, ifp, (~0 << 16), &m);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user