NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/52074: -current npf map directive broken
The following reply was made to PR kern/52074; it has been noted by GNATS.
From: David Holland <dholland-bugs%netbsd.org@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc:
Subject: Re: kern/52074: -current npf map directive broken
Date: Tue, 16 May 2017 06:12:16 +0000
Not sent to gnats.
------
From: Frank Kardel <kardel%netbsd.org@localhost>
To: Roy Marples <roy%marples.name@localhost>, Mindaugas Rasiukevicius <rmind%netbsd.org@localhost>
CC: netbsd-bugs%netbsd.org@localhost, gnats-admin%netbsd.org@localhost, Christos Zoulas
<christos%NetBSD.org@localhost>
Subject: Re: kern/52074: -current npf map directive broken
Date: Sun, 07 May 2017 23:07:42 +0200
Hi Roy !
Hmm, wouldn't this bring us back the bug again? ia == NULL for a non-local
source addresses (generated via pfil_run_hooks-NAT operation) and
IP_FORWARDING is not set as tcp_input.c:syn_cache_respond does rightfully not
set IP_FORWARDING and pfil_run_hooks has no means to set that flag. That gives
us error == -1 with your sequence.
So we would return EADDRNOTAVAIL breaking packet filter NAT action again, if I
didn't overlook something.
From what I understand this code originally attempted to avoid sending from
invalid/unusable local address (e. g. duplicate IP - error, tentative and
detached should just be dropped).
No validation can be done for non-local addresses at all. IP_FORWARDING
formerly used to be used to suppress infinite recursion on mcast forwarding,
but it seems the semantics where extended a little bit in the mean time (like
here to suppress a check).
So I cannot say something about the intentions for the IP_FORWARDING check.
For correct packet filter operation we need to distinguish the local and
non-local address case here. If we keep the previous logic for IP_FORWARDING
and ip_ifaddrvalid() then
the new expression
if (ia != NULL && (flags & IP_FORWARDING) == 0 &&
(error = ip_ifaddrvalid(ia)) != 0)
correctly limits the check to local interface addresses only keeping the
original intention/implementation for IP_FORWARDING and validity checks.
If then IP_FORWARDING and validity check needs to be adjusted that part must
be limited to local interface addresses only. (ia != NULL).
That's how I understand that code section or the intention there in the normal
and packet filter context.
I didn't check IPv6.
Frank
Home |
Main Index |
Thread Index |
Old Index