/* Validate response. */
CHECK(validate_ds(zone, message));
+ /* Check RCODE. */
if (message->rcode != dns_rcode_noerror) {
dns_zone_log(zone, ISC_LOG_NOTICE,
"checkds: bad DS response from %s: %.*s", addrbuf,
goto failure;
}
+ /* Make sure that either AA or RA bit is set. */
+ if ((message->flags & DNS_MESSAGEFLAG_AA) == 0 &&
+ (message->flags & DNS_MESSAGEFLAG_RA) == 0)
+ {
+ dns_zone_log(zone, ISC_LOG_NOTICE,
+ "checkds: bad DS response from %s: expected AA or "
+ "RA bit set",
+ addrbuf);
+ goto failure;
+ }
+
/* Lookup DS RRset. */
result = dns_message_firstname(message, DNS_SECTION_ANSWER);
while (result == ISC_R_SUCCESS) {
message->opcode = dns_opcode_query;
message->rdclass = zone->rdclass;
+ message->flags |= DNS_MESSAGEFLAG_RD;
dns_message_gettempname(message, &tempname);