From: Mark Andrews Date: Sat, 27 Sep 2014 02:30:00 +0000 (+1000) Subject: 3954. [bug] Unchecked mutex init in dlz_dlopen_driver.c [RT #37112] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b4bac6bef3a7b1f11d0cd1697feb71d4c7715a19;p=thirdparty%2Fbind9.git 3954. [bug] Unchecked mutex init in dlz_dlopen_driver.c [RT #37112] (cherry picked from commit 6b6d6509f6d80afae74eeb9f2e5baba696e29f32) --- diff --git a/CHANGES b/CHANGES index 8731ba8f1da..58d9a553909 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +3954. [bug] Unchecked mutex init in dlz_dlopen_driver.c [RT #37112] + 3953. [bug] Don't escape semi-colon in TXT fields. [RT #37159] 3952. [bug] dns_name_fullcompare failed to set *nlabelsp when the diff --git a/bin/named/win32/dlz_dlopen_driver.c b/bin/named/win32/dlz_dlopen_driver.c index 550769dc196..5ba6c9a9eb6 100644 --- a/bin/named/win32/dlz_dlopen_driver.c +++ b/bin/named/win32/dlz_dlopen_driver.c @@ -252,7 +252,9 @@ dlopen_dlz_create(const char *dlzname, unsigned int argc, char *argv[], triedload = ISC_TRUE; /* Initialize the lock */ - isc_mutex_init(&cd->lock); + result = isc_mutex_init(&cd->lock); + if (result != ISC_R_SUCCESS) + goto failed; /* Open the library */ cd->dl_handle = LoadLibraryA(cd->dl_path); @@ -263,7 +265,7 @@ dlopen_dlz_create(const char *dlzname, unsigned int argc, char *argv[], "dlz_dlopen failed to open library '%s' - %u", cd->dl_path, error); result = ISC_R_FAILURE; - goto failed; + goto cleanup_lock; } /* Find the symbols */ @@ -282,7 +284,7 @@ dlopen_dlz_create(const char *dlzname, unsigned int argc, char *argv[], { /* We're missing a required symbol */ result = ISC_R_FAILURE; - goto failed; + goto cleanup_lock; } cd->dlz_allowzonexfr = (dlz_dlopen_allowzonexfr_t *) @@ -316,7 +318,7 @@ dlopen_dlz_create(const char *dlzname, unsigned int argc, char *argv[], "should be %d in '%s'", cd->version, DLZ_DLOPEN_VERSION, cd->dl_path); result = ISC_R_FAILURE; - goto failed; + goto cleanup_lock; } /* @@ -336,12 +338,14 @@ dlopen_dlz_create(const char *dlzname, unsigned int argc, char *argv[], NULL); MAYBE_UNLOCK(cd); if (result != ISC_R_SUCCESS) - goto failed; + goto cleanup_lock; *dbdata = cd; return (ISC_R_SUCCESS); +cleanup_lock: + DESTROYLOCK(&cd->lock); failed: dlopen_log(ISC_LOG_ERROR, "dlz_dlopen of '%s' failed", dlzname); if (cd->dl_path) @@ -382,7 +386,7 @@ dlopen_dlz_destroy(void *driverarg, void *dbdata) { if (cd->dl_handle) FreeLibrary(cd->dl_handle); - (void) isc_mutex_destroy(&cd->lock); + DESTROYLOCK(&cd->lock); mctx = cd->mctx; isc_mem_put(mctx, cd, sizeof(*cd));