From: Mark Andrews Date: Fri, 19 Oct 2018 08:36:17 +0000 (+1100) Subject: expand the pool then copy over the old entries so we that failures do not break the... X-Git-Tag: v9.13.4~97^2 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=afde30fe9b1fd43595290a6763db6d52e0903c5a;p=thirdparty%2Fbind9.git expand the pool then copy over the old entries so we that failures do not break the old pool; also don't leak the new pool on error --- diff --git a/lib/isc/pool.c b/lib/isc/pool.c index 5c693a6eea7..8fb2a45e249 100644 --- a/lib/isc/pool.c +++ b/lib/isc/pool.c @@ -131,21 +131,22 @@ isc_pool_expand(isc_pool_t **sourcep, unsigned int count, newpool->init = pool->init; newpool->initarg = pool->initarg; - /* Copy over the objects from the old pool */ - for (i = 0; i < pool->count; i++) { - newpool->pool[i] = pool->pool[i]; - pool->pool[i] = NULL; - } - /* Populate the new entries */ for (i = pool->count; i < count; i++) { - result = pool->init(&newpool->pool[i], pool->initarg); + result = newpool->init(&newpool->pool[i], + newpool->initarg); if (result != ISC_R_SUCCESS) { - isc_pool_destroy(&pool); + isc_pool_destroy(&newpool); return (result); } } + /* Copy over the objects from the old pool */ + for (i = 0; i < pool->count; i++) { + newpool->pool[i] = pool->pool[i]; + pool->pool[i] = NULL; + } + isc_pool_destroy(&pool); pool = newpool; }