+3790. [bug] Handle broken nameservers that send BADVERS in
+ response to unknown EDNS options. Maintain
+ statistics on BADVERS responses.
+
3789. [bug] Null pointer dereference on rbt creation failure.
3788. [bug] dns_peer_getrequestsit was returning request_nsid by
SET_RESSTATDESC(sitin, "SIT replies received", "SitIn");
SET_RESSTATDESC(sitok, "SIT client cookie ok", "SitClientOk");
#endif
+ SET_RESSTATDESC(badvers, "bad EDNS version", "BadEDNSVersion");
INSIST(i == dns_resstatscounter_max);
dns_resstatscounter_sitin = 37,
dns_resstatscounter_sitok = 38,
- dns_resstatscounter_max = 39,
+ dns_resstatscounter_badvers = 39,
+ dns_resstatscounter_max = 40,
#else
- dns_resstatscounter_max = 35,
+ dns_resstatscounter_badvers = 35,
+ dns_resstatscounter_max = 36,
#endif
/*
#define VALID_RESOLVER(res) ISC_MAGIC_VALID(res, RES_MAGIC)
/*%
- * Private addrinfo flags. These must not conflict with DNS_FETCHOPT_NOEDNS0,
- * which we also use as an addrinfo flag.
+ * Private addrinfo flags. These must not conflict with DNS_FETCHOPT_NOEDNS0
+ * (0x008) which we also use as an addrinfo flag.
*/
#define FCTX_ADDRINFO_MARK 0x0001
#define FCTX_ADDRINFO_FORWARDER 0x1000
#define FCTX_ADDRINFO_TRIED 0x2000
#define FCTX_ADDRINFO_EDNSOK 0x4000
+#define FCTX_ADDRINFO_NOSIT 0x8000
#define UNMARKED(a) (((a)->flags & FCTX_ADDRINFO_MARK) \
== 0)
FCTX_ADDRINFO_FORWARDER) != 0)
#define TRIED(a) (((a)->flags & \
FCTX_ADDRINFO_TRIED) != 0)
+#define NOSIT(a) (((a)->flags & \
+ FCTX_ADDRINFO_NOSIT) != 0)
#define NXDOMAIN(r) (((r)->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
#define NEGATIVE(r) (((r)->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
(void) dns_peer_getrequestsit(peer, &reqsit);
#endif
}
+#ifdef ISC_PLATFORM_USESIT
+ if (NOSIT(query->addrinfo))
+ reqsit = ISC_FALSE;
+#endif
if (reqnsid) {
INSIST(ednsopt < DNS_EDNSOPTIONS);
ednsopts[ednsopt].code = DNS_OPT_NSID;
unsigned int flags, mask;
unsigned int version;
+ inc_stats(fctx->res, dns_resstatscounter_badvers);
+
+#ifdef ISC_PLATFORM_USESIT
+ /*
+ * Some servers return BADVERS to unknown
+ * EDNS options. This cannot be long term
+ * strategy.
+ */
+ dns_adb_changeflags(fctx->adb, query->addrinfo,
+ FCTX_ADDRINFO_NOSIT,
+ FCTX_ADDRINFO_NOSIT);
+#endif
+
resend = ISC_TRUE;
INSIST(opt != NULL);
version = (opt->ttl >> 16) & 0xff;