return KR_STATE_PRODUCE;
}
+ qry->flags.SAFEMODE = (*transport)->safe_mode;
+
/* Randomize query case (if not in safe mode or turned off) */
qry->secret = (qry->flags.SAFEMODE || qry->flags.NO_0X20)
? 0 : kr_rand_bytes(sizeof(qry->secret));
.name = choices[choice].address_state->name,
.protocol = protocol,
.timeout = timeout,
+ .safe_mode = choices[choice].address_state->errors[KR_SELECTION_FORMERROR],
};
addr_state->unrecoverable_errors++;
}
+ if (sel_error == KR_SELECTION_FORMERROR && transport->safe_mode) {
+ addr_state->unrecoverable_errors++;
+ }
+
addr_state->errors[sel_error]++;
addr_state->error_count++;
[KR_SELECTION_TCP_CONNECT_TIMEOUT] = false,
[KR_SELECTION_REFUSED] = true,
[KR_SELECTION_SERVFAIL] = true,
- [KR_SELECTION_FORMERROR] = true,
+ [KR_SELECTION_FORMERROR] = false,
[KR_SELECTION_NOTIMPL] = true,
[KR_SELECTION_OTHER_RCODE] = true,
[KR_SELECTION_TRUNCATED] = false,
unsigned timeout; /**< Timeout in ms to be set for UDP transmission. */
bool deduplicated; /**< True iff transport was set in worker.c:subreq_finalize,
that means it may be different from the one originally chosen one.*/
+ bool safe_mode; /**< Turn on SAFEMODE for this transport */
};
/**
enum kr_transport_protocol proto = (*transport)->protocol;
if (proto != KR_TRANSPORT_RESOLVE_A && proto != KR_TRANSPORT_RESOLVE_AAAA) {
VERBOSE_MSG(qry,
- "=> id: '%05u' choosing: '%s'@'%s' with timeout %u ms zone cut: '%s'\n",
- qry->id, ns_name, ns_str ? ns_str : "", (*transport)->timeout, zonecut_str);
+ "=> id: '%05u' choosing: '%s'@'%s' with timeout %u ms zone cut: '%s'%s\n",
+ qry->id, ns_name, ns_str ? ns_str : "", (*transport)->timeout, zonecut_str, (*transport)->safe_mode ? " SAFEMODE" : "");
} else {
const char *ip_version = (proto == KR_TRANSPORT_RESOLVE_A) ? "A" : "AAAA";
VERBOSE_MSG(qry,