Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
    }
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
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;
    }
}
Exemplo n.º 6
0
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;
    }
}
Exemplo n.º 7
0
static void
nsec_free_node(AVL_NODE_TYPE* node)
{
    ZFREE_ARRAY(node, sizeof (AVL_NODE_TYPE));
}
Exemplo n.º 8
0
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);
}