From: Marek VavruĊĦa Date: Tue, 23 Jun 2015 00:31:58 +0000 (+0200) Subject: lib/zonecut: fixed _copy() when addr pack is empty X-Git-Tag: v1.0.0-beta1~110 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb4944725b378ef3985778c8558c1e5200554103;p=thirdparty%2Fknot-resolver.git lib/zonecut: fixed _copy() when addr pack is empty --- diff --git a/lib/zonecut.c b/lib/zonecut.c index 5ea9f0f2c..8894b7031 100644 --- a/lib/zonecut.c +++ b/lib/zonecut.c @@ -113,14 +113,18 @@ static int copy_addr_set(const char *k, void *v, void *baton) if (!new_set) { return kr_error(ENOMEM); } - new_set->at = mm_alloc(dst->pool, addr_set->len); - if (!new_set->at) { - mm_free(dst->pool, new_set); - return kr_error(ENOMEM); + pack_init(*new_set); + /* Clone data only if needed */ + if (addr_set->len > 0) { + new_set->at = mm_alloc(dst->pool, addr_set->len); + if (!new_set->at) { + mm_free(dst->pool, new_set); + return kr_error(ENOMEM); + } + memcpy(new_set->at, addr_set->at, addr_set->len); + new_set->len = addr_set->len; + new_set->cap = addr_set->len; } - memcpy(new_set->at, addr_set->at, addr_set->len); - new_set->len = addr_set->len; - new_set->cap = new_set->len; /* Reinsert */ if (map_set(&dst->nsset, k, new_set) != 0) { pack_clear_mm(*new_set, mm_free, dst->pool);