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; } }
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; } }
AVL_NODE_TYPE* AVL_PREFIXED(avl_find_prev_mod)(AVL_CONST_TREE_TYPE* root, const AVL_REFERENCE_TYPE obj_hash) { AVL_NODE_TYPE* node = *root; AVL_NODE_TYPE* lower_bound = NULL; AVL_REFERENCE_TYPE h; yassert(node != NULL); /* This is one of the parts I could try to optimize * I've checked the assembly, and it sucks ... */ /* Both the double-test while/ternary and the current one * are producing the same assembly code. */ /** * Get a key that */ while(node != NULL) { h = AVL_REFERENCE(node); /* * [0] is the length of the obj_hash * * The obj_hashs starts at [1] * */ #ifdef DEBUG if(h[0] != obj_hash[0]) { DIE_MSG("NSEC3 corrupted NSEC3 node"); } #endif int cmp = memcmp(&obj_hash[1], &h[1], h[0]); /* equals */ if(cmp == 0) { // want the prev mod return nsec3_avl_node_mod_prev(node); } /* bigger */ if(cmp > 0) { lower_bound = node; node = AVL_CHILD(node, DIR_RIGHT); } else { node = AVL_CHILD(node, DIR_LEFT); } } if(lower_bound == NULL) { lower_bound = *root; yassert(lower_bound != NULL); while((node = AVL_CHILD(lower_bound, DIR_RIGHT)) != NULL) { lower_bound = node; } } return lower_bound; }