diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c index e0d4de8ff11c5c9462f2c3276a938af1fd1987f4..429fe414fed9aa4bc37eb3761325d98cf927f527 100644 --- a/src/libknot/rrset.c +++ b/src/libknot/rrset.c @@ -30,27 +30,46 @@ /* Non-API functions */ /*----------------------------------------------------------------------------*/ -size_t rrset_rdata_offset(const knot_rrset_t *rrset, - size_t pos) +static uint32_t rrset_rdata_size_total(const knot_rrset_t *rrset) { - if (rrset == NULL || rrset->rdata_indices == NULL) { + if (rrset == NULL || rrset->rdata_indices == NULL || + rrset->rdata_count == 0) { + return 0; + } + + /* Last index denotes end of all RRs. */ + return (rrset->rdata_indices[rrset->rdata_count - 1]); +} + +static size_t rrset_rdata_offset(const knot_rrset_t *rrset, + size_t pos) +{ + if (rrset == NULL || rrset->rdata_indices == NULL || + pos >= rrset->rdata_count) { return 0; } if (pos == 0) { return 0; } else { + assert(rrset->rdata_count >= 2); return rrset->rdata_indices[pos - 1]; } } -size_t rrset_rdata_item_size(const knot_rrset_t *rrset, - size_t pos) +static uint32_t rrset_rdata_item_size(const knot_rrset_t *rrset, + size_t pos) { - if (rrset == NULL || rrset->rdata_indices || rrset->rdata_count == 0) { + if (rrset == NULL || rrset->rdata_indices == NULL || + rrset->rdata_count == 0) { return 0; } + if (rrset->rdata_count == 1) { + return rrset_rdata_size_total(rrset); + } + + assert(rrset->rdata_count >= 2); return rrset_rdata_offset(rrset, pos) - rrset_rdata_offset(rrset, pos - 1); } @@ -92,19 +111,6 @@ size_t rrset_rdata_naptr_bin_chunk_size(const knot_rrset_t *rrset, return size; } - -static uint32_t rrset_rdata_size_total(const knot_rrset_t *rrset) -{ - if (rrset == NULL || rrset->rdata_indices == NULL || - rrset->rdata_count == 0) { - return 0; - } - - /* Last index denotes end of all RRs. */ - return (rrset->rdata_indices[rrset->rdata_count - 1]); -} - - /*----------------------------------------------------------------------------*/ /* API functions */ /*----------------------------------------------------------------------------*/ @@ -1037,20 +1043,25 @@ void knot_rrset_rdata_deep_free_one(knot_rrset_t *rrset, size_t pos, /* Go through the data and free dnames. Pointers can stay. */ const rdata_descriptor_t *desc = get_rdata_descriptor(rrset->type); + assert(desc); for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END;i++) { int item = desc->block_types[i]; if (descriptor_item_is_dname(item)) { - knot_dname_t *dname = - (knot_dname_t *)rdata + offset; + knot_dname_t *dname; + memcpy(&dname, rdata + offset, + sizeof(knot_dname_t *)); +// printf("%Freeing dname: %s\n", +// knot_dname_to_str(dname)); knot_dname_release(dname); offset += sizeof(knot_dname_t *); } else if (descriptor_item_is_fixed(item)) { - offset += desc->block_types[i]; + offset += item; } else if (!descriptor_item_is_remainder(item)) { assert(rrset->type == KNOT_RRTYPE_NAPTR); /* Skip the binary beginning. */ - offset += rrset_rdata_naptr_bin_chunk_size(rrset, - pos); + offset += + rrset_rdata_naptr_bin_chunk_size(rrset, + pos); knot_dname_t *dname = (knot_dname_t *)rdata + offset; knot_dname_release(dname); @@ -1058,10 +1069,6 @@ void knot_rrset_rdata_deep_free_one(knot_rrset_t *rrset, size_t pos, } } - free(rrset->rdata); - free(rrset->rdata_indices); - rrset->rdata_count = 0; - return; } @@ -1082,6 +1089,9 @@ void knot_rrset_deep_free(knot_rrset_t **rrset, int free_owner, if ((*rrset)->rrsigs != NULL) { knot_rrset_deep_free(&(*rrset)->rrsigs, 0, free_rdata_dnames); } + + free((*rrset)->rdata); + free((*rrset)->rdata_indices); if (free_owner) { knot_dname_release((*rrset)->owner); @@ -1142,8 +1152,6 @@ int knot_rrset_merge(void **r1, void **r2) rrset_rdata_size_total(rrset2)); if (tmp == NULL) { ERR_ALLOC_FAILED; - knot_rrset_dump(rrset1); - knot_rrset_dump(rrset2); return KNOT_ENOMEM; } else { rrset1->rdata = tmp; @@ -1185,8 +1193,6 @@ int knot_rrset_merge(void **r1, void **r2) rrset1->rdata_count += rrset2->rdata_count; -// knot_rrset_dump(rrset1); - return KNOT_EOK; } @@ -1766,19 +1772,25 @@ void knot_rrset_rdata_dump(const knot_rrset_t *rrset, size_t rdata_pos) fprintf(stderr, "DNAME error.\n"); return; } - fprintf(stderr, "block=%d: DNAME=%s.\n", - i, name); + fprintf(stderr, "block=%d: (%p) DNAME=%s.\n", + i, dname, name); free(name); offset += sizeof(knot_dname_t *); } else if (descriptor_item_is_fixed(item)) { - fprintf(stderr, "block=%d Raw data:\n", - i); + fprintf(stderr, "block=%d Raw data (size=%d):\n", + i, item); hex_print(rdata + offset, item); offset += item; } else if (descriptor_item_is_remainder(item)) { - printf("remainder TODO\n"); - ; + printf("offset %d\n", offset); + fprintf(stderr, "block=%d Remainder (size=%d):\n", + i, rrset_rdata_item_size(rrset, + rdata_pos) - offset); + hex_print(rdata + offset, + rrset_rdata_item_size(rrset, + rdata_pos) - offset); } else { + fprintf(stderr, "NAPTR, failing miserably\n"); assert(rrset->type == KNOT_RRTYPE_NAPTR); assert(0); } diff --git a/src/zcompile/zcompile.c b/src/zcompile/zcompile.c index 04007d815d89827b68de44fbdca5dad35f7770fd..b316eb84ce80048c43d8d5017ef96b40798cc692 100644 --- a/src/zcompile/zcompile.c +++ b/src/zcompile/zcompile.c @@ -333,6 +333,9 @@ dbg_zp_exec_detail( return ret; } + /* RDATA are safely added to RRSet now. */ + free(rdata); + return KNOT_EOK; } @@ -666,6 +669,7 @@ int zone_read(const char *name, const char *zonefile, const char *outfile, printf("RRs err=%d\n", err_count); printf("RRs new=%d\n", new_rr_count); printf("DNAMEs new=%d\n", new_dname_count); + knot_dname_free(&(my_parser.origin_from_config)); } /*! @} */