void
val_fill_reply(struct reply_info* chase, struct reply_info* orig,
- size_t skip, uint8_t* name, size_t len)
+ size_t skip, uint8_t* name, size_t len, uint8_t* signer)
{
- /* unsigned RRsets are never copied, but should not happen in
- * secure answers anyway. Except for the synthesized CNAME after
- * a DNAME. */
size_t i;
int seen_dname = 0;
chase->rrset_count = 0;
chase->ar_numrrsets = 0;
/* ANSWER section */
for(i=skip; i<orig->an_numrrsets; i++) {
- if(seen_dname && ntohs(orig->rrsets[i]->rk.type) ==
+ if(!signer) {
+ if(query_dname_compare(name,
+ orig->rrsets[i]->rk.dname) == 0)
+ chase->rrsets[chase->an_numrrsets++] =
+ orig->rrsets[i];
+ } else if(seen_dname && ntohs(orig->rrsets[i]->rk.type) ==
LDNS_RR_TYPE_CNAME) {
chase->rrsets[chase->an_numrrsets++] = orig->rrsets[i];
seen_dname = 0;
for(i = (skip > orig->an_numrrsets)?skip:orig->an_numrrsets;
i<orig->an_numrrsets+orig->ns_numrrsets;
i++) {
- if(rrset_has_signer(orig->rrsets[i], name, len)) {
+ if(!signer) {
+ if(query_dname_compare(name,
+ orig->rrsets[i]->rk.dname) == 0)
+ chase->rrsets[chase->an_numrrsets+
+ chase->ns_numrrsets++] = orig->rrsets[i];
+ } else if(rrset_has_signer(orig->rrsets[i], name, len)) {
chase->rrsets[chase->an_numrrsets+
chase->ns_numrrsets++] = orig->rrsets[i];
}
for(i= (skip>orig->an_numrrsets+orig->ns_numrrsets)?
skip:orig->an_numrrsets+orig->ns_numrrsets;
i<orig->rrset_count; i++) {
- if(rrset_has_signer(orig->rrsets[i], name, len)) {
+ if(!signer) {
+ if(query_dname_compare(name,
+ orig->rrsets[i]->rk.dname) == 0)
+ chase->rrsets[chase->an_numrrsets
+ +orig->ns_numrrsets+chase->ar_numrrsets++]
+ = orig->rrsets[i];
+ } else if(rrset_has_signer(orig->rrsets[i], name, len)) {
chase->rrsets[chase->an_numrrsets+orig->ns_numrrsets+
chase->ar_numrrsets++] = orig->rrsets[i];
}
(rep->rrset_count - i - 1));
rep->ar_numrrsets--;
rep->rrset_count--;
+ i--;
}
}
}
* The skipped part contains CNAME(and DNAME)s that have been chased.
* @param name: the signer name to look for.
* @param len: length of name.
+ * @param signer: signer name or NULL if an unsigned RRset is considered.
+ * If NULL, rrsets with the lookup name are copied over.
*/
void val_fill_reply(struct reply_info* chase, struct reply_info* orig,
- size_t cname_skip, uint8_t* name, size_t len);
+ size_t cname_skip, uint8_t* name, size_t len, uint8_t* signer);
/**
* Remove all unsigned or non-secure status rrsets from NS and AR sections.
/* extract this part of orig_msg into chase_reply for
* the eventual VALIDATE stage */
val_fill_reply(vq->chase_reply, vq->orig_msg->rep,
- vq->rrset_skip, lookup_name, lookup_len);
+ vq->rrset_skip, lookup_name, lookup_len,
+ vq->signer_name);
if(verbosity >= VERB_ALGO)
log_dns_msg("chased extract", &vq->qchase,
vq->chase_reply);