summaryrefslogtreecommitdiff
path: root/dnssec_zone.c
diff options
context:
space:
mode:
Diffstat (limited to 'dnssec_zone.c')
-rw-r--r--dnssec_zone.c50
1 files changed, 35 insertions, 15 deletions
diff --git a/dnssec_zone.c b/dnssec_zone.c
index 013517f4ac1a..ef2359bbaab1 100644
--- a/dnssec_zone.c
+++ b/dnssec_zone.c
@@ -71,8 +71,9 @@ ldns_dnssec_rrs_add_rr(ldns_dnssec_rrs *rrs, ldns_rr *rr)
new_rrs->next = rrs->next;
rrs->rr = rr;
rrs->next = new_rrs;
- }
- /* Silently ignore equal rr's */
+ } else
+ return LDNS_STATUS_EQUAL_RR;
+
return LDNS_STATUS_OK;
}
@@ -732,25 +733,37 @@ ldns_dnssec_zone_new_frm_fp_l(ldns_dnssec_zone** z, FILE* fp, const ldns_rdf* or
*/
ldns_rr_set_ttl(cur_rr, ldns_rr_ttl(prev_rr));
- prev_rr = cur_rr;
#endif
status = ldns_dnssec_zone_add_rr(newzone, cur_rr);
- if (status ==
- LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND) {
-
+ switch(status) {
+ case LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND:
if (rr_is_rrsig_covering(cur_rr,
LDNS_RR_TYPE_NSEC3)){
ldns_rr_list_push_rr(todo_nsec3_rrsigs,
cur_rr);
} else {
ldns_rr_list_push_rr(todo_nsec3s,
- cur_rr);
+ cur_rr);
}
status = LDNS_STATUS_OK;
-
- } else if (status != LDNS_STATUS_OK)
+ break;
+ case LDNS_STATUS_EQUAL_RR:
+ ldns_rr_free(cur_rr);
+#ifndef FASTER_DNSSEC_ZONE_NEW_FRM_FP
+ cur_rr = prev_rr;
+#else
+ cur_rr = NULL;
+#endif
+ status = LDNS_STATUS_OK;
+ break;
+ case LDNS_STATUS_OK:
+ break;
+ default:
goto error;
-
+ }
+#ifndef FASTER_DNSSEC_ZONE_NEW_FRM_FP
+ prev_rr = cur_rr;
+#endif
break;
case LDNS_STATUS_SYNTAX_TTL: /* the ttl was set*/
@@ -1510,11 +1523,18 @@ dnssec_zone_rr_iter_first(dnssec_zone_rr_iter *i, ldns_dnssec_zone *zone)
: (ldns_dnssec_name *)i->node->data;
if (zone->hashed_names) {
- do {
- i->nsec3_node = ldns_rbtree_first(zone->hashed_names);
- i->nsec3_name = i->nsec3_node == LDNS_RBTREE_NULL ?NULL
- : (ldns_dnssec_name*)i->nsec3_node->data;
- } while (i->nsec3_name && !i->nsec3_name->nsec);
+ i->nsec3_node = ldns_rbtree_first(zone->hashed_names);
+ i->nsec3_name = i->nsec3_node == LDNS_RBTREE_NULL ? NULL
+ : (ldns_dnssec_name*)i->nsec3_node->data;
+ /* While there is no NSEC3 RR present at this hashed name,
+ * skip to the next hashed name.
+ */
+ while (i->nsec3_name && !i->nsec3_name->nsec) {
+ /* next nsec3 */
+ i->nsec3_node = ldns_rbtree_next(i->nsec3_node);
+ i->nsec3_name = i->nsec3_node == LDNS_RBTREE_NULL ? NULL
+ : (ldns_dnssec_name*)i->nsec3_node->data;
+ }
}
dnssec_zone_rr_iter_set_state_for_next_name(i);
return dnssec_zone_rr_iter_next(i);