]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/zonecut: use mempool for nsset pack
authorMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 19 May 2015 21:56:44 +0000 (23:56 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 19 May 2015 21:56:44 +0000 (23:56 +0200)
lib/generic/pack.h
lib/zonecut.c

index 1fcdc616ce74d4d6f21f8b09ec8e2fe9b7958e4d..5bad8f0c196dcf5ed19374970fd9671fe1fefa37 100644 (file)
@@ -78,7 +78,7 @@ typedef array_t(uint8_t) pack_t;
        array_clear(pack)
 /** @internal Clear pack with a callback. */
 #define pack_clear_mm(pack, free, baton) \
-       array_clear_mm(pack, array_std_free, baton)
+       array_clear_mm((pack), (free), (baton))
 /** Incrementally reserve objects in the pack. */
 #define pack_reserve(pack, objs_count, objs_len) \
        pack_reserve_mm((pack), (objs_count), (objs_len), array_std_reserve, NULL)
index a6f1f6077b7850a2a8493e65fbe0128ed337ead3..e8d961a87c7d3ef0b1a16ff8ee88c49771550c62 100644 (file)
@@ -52,6 +52,25 @@ static const struct hint_info SBELT[HINT_COUNT] = {
         { U8("\x01""m""\x0c""root-servers""\x03""net"), U8("\xca\x0c\x1b!")    }, /* 202.12.27.33 */
 };
 
+static inline int nsset_reserve(void *baton, char **mem, size_t elm_size, size_t want, size_t *have)
+{
+       if (*have >= want) {
+               return 0;
+       } else {
+               mm_ctx_t *pool = baton;
+               size_t next_size = (want + 3);
+               void *mem_new = mm_alloc(pool, next_size * elm_size);
+               if (mem_new != NULL) {
+                       memcpy(mem_new, *mem, (*have)*(elm_size));
+                       mm_free(pool, *mem);
+                       *mem = mem_new;
+                       *have = next_size;
+                       return 0;
+               }
+       }
+       return -1;
+}
+
 static void update_cut_name(struct kr_zonecut *cut, const knot_dname_t *name)
 {
        if (knot_dname_is_equal(name, cut->name)) {
@@ -126,7 +145,7 @@ int kr_zonecut_add(struct kr_zonecut *cut, const knot_dname_t *ns, const knot_rd
                return kr_ok();
        }
        uint16_t rdlen = knot_rdata_rdlen(rdata);
-       int ret = pack_reserve(*pack, 1, rdlen);
+       int ret = pack_reserve_mm(*pack, 1, rdlen, nsset_reserve, cut->pool);
        if (ret != 0) {
                return kr_error(ENOMEM);
        }