/** * Free dynamically allocated memory associated with given set of settings. * @pre *set is initialized set of settings, set != NULL && *set != NULL * @post *set == NULL */ void settings_set_free(settings_set_t **set) { isc_mem_t *mctx = NULL; setting_t *s = NULL; if (set == NULL || *set == NULL) return; if ((*set)->mctx != NULL) { mctx = (*set)->mctx; if ((*set)->lock != NULL) { DESTROYLOCK((*set)->lock); SAFE_MEM_PUT_PTR(mctx, (*set)->lock); } for (s = (*set)->first_setting; s->name != NULL; s++) { if (s->is_dynamic) isc_mem_free(mctx, s->value.value_char); } if ((*set)->first_setting != NULL) isc_mem_free(mctx, (*set)->first_setting); isc_mem_free(mctx, (*set)->name); isc_mem_free(mctx, *set); isc_mem_detach(&mctx); } *set = NULL; }
static isc_result_t rdata_clone(isc_mem_t *mctx, dns_rdata_t *source, dns_rdata_t **targetp) { isc_result_t result; dns_rdata_t *target = NULL; isc_region_t target_region, source_region; REQUIRE(mctx != NULL); REQUIRE(source != NULL); REQUIRE(targetp != NULL && *targetp == NULL); CHECKED_MEM_GET_PTR(mctx, target); dns_rdata_init(target); dns_rdata_toregion(source, &source_region); CHECKED_MEM_GET(mctx, target_region.base, source_region.length); target_region.length = source_region.length; memcpy(target_region.base, source_region.base, source_region.length); dns_rdata_fromregion(target, source->rdclass, source->type, &target_region); *targetp = target; return ISC_R_SUCCESS; cleanup: SAFE_MEM_PUT_PTR(mctx, target); return result; }
isc_result_t rdatalist_clone(isc_mem_t *mctx, dns_rdatalist_t *source, dns_rdatalist_t **targetp) { dns_rdatalist_t *target; dns_rdata_t *source_rdata; dns_rdata_t *target_rdata; isc_result_t result; REQUIRE(mctx != NULL); REQUIRE(source != NULL); REQUIRE(targetp != NULL && *targetp == NULL); CHECKED_MEM_GET_PTR(mctx, target); dns_rdatalist_init(target); target->rdclass = source->rdclass; target->type = source->type; target->covers = source->covers; target->ttl = source->ttl; source_rdata = HEAD(source->rdata); while (source_rdata != NULL) { target_rdata = NULL; CHECK(rdata_clone(mctx, source_rdata, &target_rdata)); APPEND(target->rdata, target_rdata, link); source_rdata = NEXT(source_rdata, link); } *targetp = target; return ISC_R_SUCCESS; cleanup: if (target) free_rdatalist(mctx, target); SAFE_MEM_PUT_PTR(mctx, target); return result; }
static isc_result_t cache_node_create(ldap_cache_t *cache, ldapdb_rdatalist_t rdatalist, cache_node_t **nodep) { isc_result_t result; cache_node_t *node; REQUIRE(cache != NULL); REQUIRE(nodep != NULL && *nodep == NULL); CHECKED_MEM_GET_PTR(cache->mctx, node); ZERO_PTR(node); isc_mem_attach(cache->mctx, &node->mctx); node->rdatalist = rdatalist; CHECK(isc_time_nowplusinterval(&node->valid_until, &cache->cache_ttl)); *nodep = node; return ISC_R_SUCCESS; cleanup: SAFE_MEM_PUT_PTR(cache->mctx, node); return result; }