void nsec3_load_destroy(nsec3_load_context *context) { for(int i = 0; i <= ptr_vector_last_index(&context->nsec3chain); ++i) { nsec3_load_context_chain *chain = (nsec3_load_context_chain*)ptr_vector_get(&context->nsec3chain, i); nsec3_load_context_chain_delete(chain); } if(!ptr_set_avl_isempty(&context->postponed_rrsig)) { ptr_set_avl_iterator iter; ptr_set_avl_iterator_init(&context->postponed_rrsig, &iter); while(ptr_set_avl_iterator_hasnext(&iter)) { ptr_node *rrsig_node = ptr_set_avl_iterator_next_node(&iter); u8 *key = (u8*)rrsig_node->key; if(rrsig_node->key != NULL) { ZFREE_ARRAY(rrsig_node->key, key[0] + 1); } rrsig_node->key = NULL; rrsig_node->value = NULL; } ptr_set_avl_destroy(&context->postponed_rrsig); } context->zone = NULL; }
void nsec3_remove_nsec3_by_digest(zdb_zone* zone, const u8 *nsec3_digest, const u8* nsec3_rdata) { nsec3_zone* n3 = zone->nsec.nsec3; while(n3 != NULL) { if(nsec3_zone_rdata_compare(n3->rdata, nsec3_rdata) == 0) { nsec3_zone_item* item = nsec3_avl_find(&n3->items, nsec3_digest); if(item != NULL) { int depth; log_debug("nsec3_remove_nsec3_by_name: destroying %{digest32h}", item->digest); /* GOT IT : AN NSEC3 RECORD IS REMOVED BY IXFR BUT THE LABEL HAS NOT BEEN CHANGED I PRESUME IT IS BECAUSE THE AXFR CHAIN IS CHANGED I NEED A REPLACE FUNCTION, I NEED TO SORT THE IXFR NSEC(3) OPERATIONS */ if(item->sc > 0) { nsec3_zone_item* prev = nsec3_avl_node_mod_prev(item); if(prev != NULL) { nsec3_move_all_star(item, prev); } else { nsec3_remove_all_star(item); } } nsec3_remove_all_owners(item); zassert(item->rc == 0 && item->sc == 0); ZFREE_ARRAY(item->type_bit_maps, item->type_bit_maps_size); item->type_bit_maps = NULL; item->type_bit_maps_size = 0; nsec3_zone_item_rrsig_delete_all(item); nsec3_avl_delete(&n3->items, item->digest); } break; } n3 = n3->next; } }
static void nsec3_free_node(nsec3_zone_item* node) { /* * This assert is wrong because this is actually the payload that has just overwritten our node * assert(node->rc == 0 && node->sc == 0 && node->label.owners == NULL && node->star_label.owners == NULL & node->type_bit_maps == NULL); */ #ifdef DEBUG yassert((node->rc == 0) && (node->sc == 0)); #endif u32 node_size = NSEC3_NODE_SIZE(node); ZFREE_ARRAY(node, node_size); }
static void nsec3_load_context_record_delete(nsec3_context_record *r) { zdb_packed_ttlrdata *rrsig = r->rrsig; while(rrsig != NULL) { zdb_packed_ttlrdata *next = rrsig->next; ZDB_RECORD_ZFREE(rrsig); rrsig = next; } size_t digest_len = 1 + r->digest_then_rdata[0]; ZFREE_ARRAY(r, sizeof(nsec3_context_record) + digest_len + r->rdata_size); }
ya_result nsec3_load_add_nsec3(nsec3_load_context *context, const u8 *digest, s32 ttl, const u8 *rdata, u16 rdata_size) { /* * Get the right chain from the rdata * Add the record to the chain */ if((rdata_size < 5) || (NSEC3_RDATA_ALGORITHM(rdata) != DNSSEC_DIGEST_TYPE_SHA1)) { return DNSSEC_ERROR_UNSUPPORTEDDIGESTALGORITHM; } nsec3_context_record* nsec3_r = nsec3_load_context_record_new(digest, ttl, rdata, rdata_size); if(nsec3_r != NULL) { nsec3_load_context_chain* chain = nsec3_load_context_get_chain(context, nsec3_r); nsec3_load_context_chain_add_nsec3(chain, nsec3_r); context->last_inserted_nsec3 = nsec3_r; if(!ptr_set_avl_isempty(&context->postponed_rrsig)) { ptr_node *node = ptr_set_avl_find(&context->postponed_rrsig, nsec3_r->digest_then_rdata); if(node != NULL) { u8 *key = node->key; nsec3_r->rrsig = (zdb_packed_ttlrdata*)node->value; ptr_set_avl_delete(&context->postponed_rrsig, nsec3_r->digest_then_rdata); ZFREE_ARRAY(key, key[0] + 1); } } return SUCCESS; } else { context->last_inserted_nsec3 = NULL; return DNSSEC_ERROR_NSEC3_LABELTODIGESTFAILED; } }
void nsec3_remove_nsec3_by_name(zdb_zone* zone, const u8 *nsec3_label, const u8* nsec3_rdata) { nsec3_zone* n3 = zone->nsec.nsec3; while(n3 != NULL) { if(nsec3_zone_rdata_compare(n3->rdata, nsec3_rdata) == 0) { u8 digest[256]; #ifndef NDEBUG memset(digest, 0xd1, sizeof(digest)); #endif ya_result digest_len = base32hex_decode((char*)&nsec3_label[1], nsec3_label[0], &digest[1]); if(ISOK(digest_len)) { digest[0] = digest_len; nsec3_zone_item* item = nsec3_avl_find(&n3->items, digest); if(item != NULL) { int depth; log_debug("nsec3_remove_nsec3_by_name: destroying %{digest32h}", item->digest); /* GOT IT : AN NSEC3 RECORD IS REMOVED BY IXFR BUT THE LABEL HAS NOT BEEN CHANGED I PRESUME IT IS BECAUSE THE AXFR CHAIN IS CHANGED I NEED A REPLACE FUNCTION, I NEED TO SORT THE IXFR NSEC(3) OPERATIONS */ if(item->sc > 0) { nsec3_zone_item* prev = nsec3_avl_node_mod_prev(item); if(prev != NULL) { nsec3_move_all_star(item, prev); } else { nsec3_remove_all_star(item); } } nsec3_remove_all_owners(item); zassert(item->rc == 0 && item->sc == 0); ZFREE_ARRAY(item->type_bit_maps, item->type_bit_maps_size); item->type_bit_maps = NULL; item->type_bit_maps_size = 0; nsec3_zone_item_rrsig_delete_all(item); nsec3_avl_delete(&n3->items, item->digest); } } break; } n3 = n3->next; } }
static void nsec_free_node(AVL_NODE_TYPE* node) { ZFREE_ARRAY(node, sizeof (AVL_NODE_TYPE)); }
static void nsec3_load_context_chain_delete(nsec3_load_context_chain *chain) { ptr_vector_free_empties(&chain->nsec3_added, nsec3_load_context_record_delete_void); ZFREE_ARRAY(chain, sizeof(nsec3_load_context_chain) + chain->nsec3param_rdata_size); }