From: Vladimír Čunát Date: Tue, 23 Oct 2018 15:43:25 +0000 (+0200) Subject: kr_zonecut_move(): new function X-Git-Tag: v3.2.0~29^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d864b4c3fda803c429b3c0a3601b43cc07285a4;p=thirdparty%2Fknot-resolver.git kr_zonecut_move(): new function It's more efficient for some our use cases, and hopefully also more idiomatic. --- diff --git a/lib/resolve.c b/lib/resolve.c index 90ea2f92d..4ef01b5d2 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -246,13 +246,13 @@ static int ns_fetch_cut(struct kr_query *qry, const knot_dname_t *requested_name if (ret == kr_error(ENOENT)) { /* No cached cut found, start from SBELT * and issue priming query. */ + kr_zonecut_deinit(&cut_found); ret = kr_zonecut_set_sbelt(req->ctx, &qry->zone_cut); if (ret != 0) { return KR_STATE_FAIL; } VERBOSE_MSG(qry, "=> using root hints\n"); qry->flags.AWAIT_CUT = false; - kr_zonecut_deinit(&cut_found); return KR_STATE_DONE; } else if (ret != kr_ok()) { kr_zonecut_deinit(&cut_found); @@ -295,12 +295,8 @@ static int ns_fetch_cut(struct kr_query *qry, const knot_dname_t *requested_name qry->flags.AWAIT_CUT = false; return KR_STATE_DONE; } - /* Copy fetched name */ - qry->zone_cut.name = knot_dname_copy(cut_found.name, qry->zone_cut.pool); - /* Copy fetched address set */ - kr_zonecut_copy(&qry->zone_cut, &cut_found); - /* Copy fetched ta & keys */ - kr_zonecut_copy_trust(&qry->zone_cut, &cut_found); + /* Use the found zone cut. */ + kr_zonecut_move(&qry->zone_cut, &cut_found); /* Check if there's a non-terminal between target and current cut. */ struct kr_cache *cache = &req->ctx->cache; check_empty_nonterms(qry, pkt, cache, qry->timestamp.tv_sec); diff --git a/lib/zonecut.c b/lib/zonecut.c index d0abe9daa..1c31d933e 100644 --- a/lib/zonecut.c +++ b/lib/zonecut.c @@ -98,6 +98,13 @@ void kr_zonecut_deinit(struct kr_zonecut *cut) knot_rrset_free(cut->trust_anchor, cut->pool); } +void kr_zonecut_move(struct kr_zonecut *to, const struct kr_zonecut *from) +{ + if (!to || !from) abort(); + kr_zonecut_deinit(to); + memcpy(to, from, sizeof(*to)); +} + void kr_zonecut_set(struct kr_zonecut *cut, const knot_dname_t *name) { if (!cut || !name) { diff --git a/lib/zonecut.h b/lib/zonecut.h index f1ab0c31c..b7def14bf 100644 --- a/lib/zonecut.h +++ b/lib/zonecut.h @@ -53,6 +53,14 @@ int kr_zonecut_init(struct kr_zonecut *cut, const knot_dname_t *name, knot_mm_t KR_EXPORT void kr_zonecut_deinit(struct kr_zonecut *cut); +/** + * Move a zonecut, transferring ownership of any pointed-to memory. + * @param to the target - it gets deinit-ed + * @param from the source - not modified, but shouldn't be used afterward + */ +KR_EXPORT +void kr_zonecut_move(struct kr_zonecut *to, const struct kr_zonecut *from); + /** * Reset zone cut to given name and clear address list. * @note This clears the address list even if the name doesn't change. TA and DNSKEY don't change.