From 0c57bf16a5d30afd33da840981371f3db27548d9 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 11 Jun 2014 21:42:36 +1000 Subject: [PATCH] fix unbalanced lock; test for non NULL before dereference; --- lib/isc/random.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/isc/random.c b/lib/isc/random.c index 06640eec7e..0979f3e68d 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