From: Otto Moerbeek Date: Wed, 13 Nov 2019 09:11:58 +0000 (+0100) Subject: ednsmap might be cleared while yielding; so reassign pointer. X-Git-Tag: dnsdist-1.4.0^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=90e8ea71abacb8879482fe27a5521d1f4d0ef76d;p=thirdparty%2Fpdns.git ednsmap might be cleared while yielding; so reassign pointer. Switch away from a ref to a pointer because of above and use modern init for EDNSStatus. --- diff --git a/pdns/syncres.cc b/pdns/syncres.cc index 2e3b03d1af..1eed0ea2aa 100644 --- a/pdns/syncres.cc +++ b/pdns/syncres.cc @@ -536,16 +536,15 @@ int SyncRes::asyncresolveWrapper(const ComboAddress& ip, bool ednsMANDATORY, con If '3', send bare queries */ - SyncRes::EDNSStatus* ednsstatus; - ednsstatus = &t_sstorage.ednsstatus[ip]; // does this include port? YES + SyncRes::EDNSStatus* ednsstatus = &t_sstorage.ednsstatus[ip]; // does this include port? YES - if(ednsstatus->modeSetAt && ednsstatus->modeSetAt + 3600 < d_now.tv_sec) { - *ednsstatus=SyncRes::EDNSStatus(); + if (ednsstatus->modeSetAt && ednsstatus->modeSetAt + 3600 < d_now.tv_sec) { + *ednsstatus = SyncRes::EDNSStatus(); // cerr<<"Resetting EDNS Status for "<mode; - SyncRes::EDNSStatus::EDNSMode oldmode = mode; + SyncRes::EDNSStatus::EDNSMode *mode = &ednsstatus->mode; + SyncRes::EDNSStatus::EDNSMode oldmode = *mode; int EDNSLevel = 0; auto luaconfsLocal = g_luaconfs.getLocal(); ResolveContext ctx; @@ -560,11 +559,11 @@ int SyncRes::asyncresolveWrapper(const ComboAddress& ip, bool ednsMANDATORY, con for(int tries = 0; tries < 3; ++tries) { // cerr<<"Remote '"<outgoingProtobufExportConfig.exportTypes, res, chained); } + // ednsstatus might be cleared, so do a new lookup + ednsstatus = &t_sstorage.ednsstatus[ip]; // does this include port? YES + mode = &ednsstatus->mode; if(ret < 0) { return ret; // transport error, nothing to learn here } @@ -584,25 +586,25 @@ int SyncRes::asyncresolveWrapper(const ComboAddress& ip, bool ednsMANDATORY, con if(ret == 0) { // timeout, not doing anything with it now return ret; } - else if(mode==EDNSStatus::UNKNOWN || mode==EDNSStatus::EDNSOK || mode == EDNSStatus::EDNSIGNORANT ) { + else if (*mode == EDNSStatus::UNKNOWN || *mode == EDNSStatus::EDNSOK || *mode == EDNSStatus::EDNSIGNORANT ) { if(res->d_validpacket && !res->d_haveEDNS && res->d_rcode == RCode::FormErr) { // cerr<<"Downgrading to NOEDNS because of "<d_rcode)<<" for query to "<d_haveEDNS) { - if(mode != EDNSStatus::EDNSIGNORANT) { - mode = EDNSStatus::EDNSIGNORANT; + if (*mode != EDNSStatus::EDNSIGNORANT) { + *mode = EDNSStatus::EDNSIGNORANT; // cerr<<"We find that "<modeSetAt) + if (oldmode != *mode || !ednsstatus->modeSetAt) ednsstatus->modeSetAt=d_now.tv_sec; // cerr<<"Result: ret="<d_haveEDNS<<", new mode: "<