]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
841. [bug] When sdb modules were not declared threadsafe, their
authorBrian Wellington <source@isc.org>
Tue, 29 May 2001 18:34:24 +0000 (18:34 +0000)
committerBrian Wellington <source@isc.org>
Tue, 29 May 2001 18:34:24 +0000 (18:34 +0000)
create and destroy functions were not serialized.

CHANGES
lib/dns/sdb.c

diff --git a/CHANGES b/CHANGES
index 8a5348e2549be57215646b9801d5fad1fc38a7bf..f2133be92f37549d4c602a8de5062fa0deaa87d9 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+ 841.  [bug]           When sdb modules were not declared threadsafe, their
+                       create and destroy functions were not serialized.
+
  840.  [bug]           The config file parser could print the wrong file
                        name if an error was detected after an included file
                        was parsed. [RT #1353]
index 8cecfc33e9101e5bd9ab7684d94cbaa0e190df02..fac888afc0a6762e582dfaac21c7d190376d341f 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: sdb.c,v 1.31 2001/05/02 19:25:19 bwelling Exp $ */
+/* $Id: sdb.c,v 1.32 2001/05/29 18:34:24 bwelling Exp $ */
 
 #include <config.h>
 
@@ -52,6 +52,7 @@ struct dns_sdbimplementation {
        void                            *driverdata;
        unsigned int                    flags;
        isc_mem_t                       *mctx;
+       isc_mutex_t                     driverlock;
        dns_dbimplementation_t          *dbimp;
 };
 
@@ -62,7 +63,6 @@ struct dns_sdb {
        dns_sdbimplementation_t         *implementation;
        void                            *dbdata;
        isc_mutex_t                     lock;
-       isc_mutex_t                     driverlock;
        /* Locked */
        unsigned int                    references;
 
@@ -119,14 +119,14 @@ typedef struct sdb_rdatasetiter {
        do {                                                            \
                unsigned int flags = sdb->implementation->flags;        \
                if ((flags & DNS_SDBFLAG_THREADSAFE) == 0)              \
-                       LOCK(&sdb->driverlock);                         \
+                       LOCK(&sdb->implementation->driverlock);         \
        } while (0)
 
 #define MAYBE_UNLOCK(sdb)                                              \
        do {                                                            \
                unsigned int flags = sdb->implementation->flags;        \
                if ((flags & DNS_SDBFLAG_THREADSAFE) == 0)              \
-                       UNLOCK(&sdb->driverlock);                       \
+                       UNLOCK(&sdb->implementation->driverlock);       \
        } while (0)
 
 static int dummy;
@@ -220,16 +220,28 @@ dns_sdb_register(const char *drivername, const dns_sdbmethods_t *methods,
        imp->flags = flags;
        imp->mctx = NULL;
        isc_mem_attach(mctx, &imp->mctx);
+       result = isc_mutex_init(&imp->driverlock);
+       if (result != ISC_R_SUCCESS) {
+               UNEXPECTED_ERROR(__FILE__, __LINE__,
+                                "isc_mutex_init() failed: %s",
+                                isc_result_totext(result));
+               goto cleanup_mctx;
+       }
+
        imp->dbimp = NULL;
        result = dns_db_register(drivername, dns_sdb_create, imp, mctx,
                                 &imp->dbimp);
-       if (result != ISC_R_SUCCESS) {
-               dns_sdb_unregister(&imp);
-               return (result);
-       }
+       if (result != ISC_R_SUCCESS)
+               goto cleanup_mutex;
        *sdbimp = imp;
 
        return (ISC_R_SUCCESS);
+
+ cleanup_mutex:
+       DESTROYLOCK(&imp->driverlock);
+ cleanup_mctx:
+       isc_mem_put(mctx, imp, sizeof(dns_sdbimplementation_t));
+       return (result);
 }
 
 void
@@ -241,6 +253,7 @@ dns_sdb_unregister(dns_sdbimplementation_t **sdbimp) {
 
        imp = *sdbimp;
        dns_db_unregister(&imp->dbimp);
+       DESTROYLOCK(&imp->driverlock);
 
        mctx = imp->mctx;
        isc_mem_put(mctx, imp, sizeof(dns_sdbimplementation_t));
@@ -476,13 +489,15 @@ destroy(dns_sdb_t *sdb) {
 
        mctx = sdb->common.mctx;
 
-       if (imp->methods->destroy != NULL)
+       if (imp->methods->destroy != NULL) {
+               MAYBE_LOCK(sdb);
                imp->methods->destroy(sdb->zone, imp->driverdata,
                                      &sdb->dbdata);
+               MAYBE_UNLOCK(sdb);
+       }
 
        isc_mem_free(mctx, sdb->zone);
        DESTROYLOCK(&sdb->lock);
-       DESTROYLOCK(&sdb->driverlock);
 
        sdb->common.magic = 0;
        sdb->common.impmagic = 0;
@@ -1195,18 +1210,9 @@ dns_sdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type,
                goto cleanup_mctx;
        }
 
-       result = isc_mutex_init(&sdb->driverlock);
-       if (result != ISC_R_SUCCESS) {
-               UNEXPECTED_ERROR(__FILE__, __LINE__,
-                                "isc_mutex_init() failed: %s",
-                                isc_result_totext(result));
-               result = ISC_R_UNEXPECTED;
-               goto cleanup_lock;
-       }
-
        result = dns_name_dupwithoffsets(origin, mctx, &sdb->common.origin);
        if (result != ISC_R_SUCCESS)
-               goto cleanup_driverlock;
+               goto cleanup_lock;
 
        isc_buffer_init(&b, zonestr, sizeof(zonestr));
        result = dns_name_totext(origin, ISC_TRUE, &b);
@@ -1222,8 +1228,10 @@ dns_sdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type,
 
        sdb->dbdata = NULL;
        if (imp->methods->create != NULL) {
+               MAYBE_LOCK(sdb);
                result = imp->methods->create(sdb->zone, argc, argv,
                                              imp->driverdata, &sdb->dbdata);
+               MAYBE_UNLOCK(sdb);
                if (result != ISC_R_SUCCESS)
                        goto cleanup_zonestr;
        }
@@ -1241,8 +1249,6 @@ dns_sdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type,
        isc_mem_free(mctx, sdb->zone);
  cleanup_origin:
        dns_name_free(&sdb->common.origin, mctx);
- cleanup_driverlock:
-       isc_mutex_destroy(&sdb->driverlock);
  cleanup_lock:
        isc_mutex_destroy(&sdb->lock);
  cleanup_mctx: