From: Mark Andrews Date: Wed, 11 Jun 2014 11:42:36 +0000 (+1000) Subject: fix unbalanced lock; test for non NULL before dereference; X-Git-Tag: v9.11.0a1~1553 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=0c57bf16a5d30afd33da840981371f3db27548d9;p=thirdparty%2Fbind9.git fix unbalanced lock; test for non NULL before dereference; --- diff --git a/lib/isc/random.c b/lib/isc/random.c index 06640eec7ee..0979f3e68db 100644 --- a/lib/isc/random.c +++ b/lib/isc/random.c @@ -231,6 +231,7 @@ isc_rng_create(isc_mem_t *mctx, isc_entropy_t *entropy, isc_rng_t **rngp) { void isc_rng_attach(isc_rng_t *source, isc_rng_t **targetp) { + REQUIRE(VALID_RNG(source)); REQUIRE(targetp != NULL && *targetp == NULL); @@ -255,10 +256,13 @@ destroy(isc_rng_t **rngp) { void isc_rng_detach(isc_rng_t **rngp) { - isc_rng_t *rng = *rngp; + isc_rng_t *rng; isc_boolean_t dest = ISC_FALSE; - REQUIRE(VALID_RNG(rng)); + REQUIRE(rngp != NULL && VALID_RNG(*rngp)); + + rng = *rngp; + *rngp = NULL; LOCK(&rng->lock); @@ -266,13 +270,10 @@ isc_rng_detach(isc_rng_t **rngp) { rng->references--; if (rng->references == 0) dest = ISC_TRUE; + UNLOCK(&rng->lock); if (dest) destroy(rngp); - else { - UNLOCK(&rng->lock); - *rngp = NULL; - } } static void