On Fri, Nov 01, 2019 at 09:45:37PM +0100, Florian Obser wrote: > On Fri, Nov 01, 2019 at 09:35:07PM +0100, Remi Locherer wrote: > > On Thu, Oct 31, 2019 at 08:14:04PM +0100, Otto Moerbeek wrote: > > > Hi, > > > > > > So here's a new diff that incorporates the bug fix mentioned plus > > > debug printf line changes suggested by Stuart. > > > > > > Please note that this is a diff on top of very recent current, i.e. > > > florian's work he committed today. That means that you need to be > > > up-to-date (including a recent libc update that was committed a few > > > days ago) to be able to test this version. > > > > I upgraded to a snapshot from today, updated the source and applied > > your diff. Then I did the same test as last time using pf to block port 53 > > (block return out log inet proto {tcp udp} to !9.9.9.9 port 53). > > > > Result: the non functional type asr is selected instead of the forwarder. > > > > $ doas unwindctl status > > captive portal is unknown > > > > selected type status > > recursor dead > > forwarder validating (OppDoT) > > dhcp unknown (OppDoT) > > * asr dead > > $ > > $ getent hosts undeadly.org > > $ echo $? > > 2 > > $ dig +short undeadly.org @9.9.9.9 > > 94.142.241.173 > > $ > > > > Without your patch unwind behaves similar regarding the type selection: > > > > $ doas unwindctl status > > captive portal is unknown > > ^ you are creating a not supported configuration. > > When we are behind a captive portal or don't know yet if we are behind > a captive portal resolving is forced to asr. > > That might not be very wise if asr is dead but I currently don't see > how this can happen in practice except with a well aimed foot-gun.
Actually, I have an idea how this can happen in practice, please try this: diff --git resolver.c resolver.c index f59860a5e98..5bbc63f60fa 100644 --- resolver.c +++ resolver.c @@ -1282,7 +1282,8 @@ best_resolver(void) if (captive_portal_state == PORTAL_UNKNOWN || captive_portal_state == BEHIND) { - if (resolvers[UW_RES_ASR] != NULL) { + if (resolvers[UW_RES_ASR] != NULL && resolvers[UW_RES_ASR]-> + state != DEAD) { res = resolvers[UW_RES_ASR]; goto out; } > > > > > selected type status > > recursor dead > > forwarder validating > > dhcp dead > > * asr dead > > $ > > > > -- > I'm not entirely sure you are real. > -- I'm not entirely sure you are real.