aboutsummaryrefslogtreecommitdiff
path: root/dns/bind911
diff options
context:
space:
mode:
authorMathieu Arnold <mat@FreeBSD.org>2020-07-20 13:50:13 +0000
committerMathieu Arnold <mat@FreeBSD.org>2020-07-20 13:50:13 +0000
commit093041dd65efc48d8909cacb1f28e4cb264a802e (patch)
tree2b7978fa878167efcb0e8f6ec85085464d6bb668 /dns/bind911
parent7a5c5426cd166bdb23f7ef30a724d4cfea7f7e8e (diff)
downloadports-093041dd65efc48d8909cacb1f28e4cb264a802e.tar.gz
ports-093041dd65efc48d8909cacb1f28e4cb264a802e.zip
Fix rndc with LMDB 0.9.26+.
PR: 247950 Submitted by: delphij Reportedy: david isnic is Obtained from: https://gitlab.isc.org/isc-projects/bind9/-/issues/1976 MFH: 2020Q3 (not sure if needed)
Notes
Notes: svn path=/head/; revision=542640
Diffstat (limited to 'dns/bind911')
-rw-r--r--dns/bind911/Makefile3
-rw-r--r--dns/bind911/files/extrapatch-bind-lmdb-lock235
2 files changed, 237 insertions, 1 deletions
diff --git a/dns/bind911/Makefile b/dns/bind911/Makefile
index 280278b641f8..af9d9b725ef1 100644
--- a/dns/bind911/Makefile
+++ b/dns/bind911/Makefile
@@ -3,7 +3,7 @@
PORTNAME= bind
PORTVERSION= ${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc/.rc/}
-PORTREVISION= 0
+PORTREVISION= 1
CATEGORIES= dns net
MASTER_SITES= ISC/bind9/${ISCVERSION}
PKGNAMESUFFIX= 911
@@ -159,6 +159,7 @@ LARGE_FILE_CONFIGURE_ENABLE= largefile
LMDB_CONFIGURE_WITH= lmdb=${LOCALBASE}
LMDB_LIB_DEPENDS= liblmdb.so:databases/lmdb
+LMDB_EXTRA_PATCHES= ${FILESDIR}/extrapatch-bind-lmdb-lock
MINCACHE_EXTRA_PATCHES= ${FILESDIR}/extrapatch-bind-min-override-ttl
diff --git a/dns/bind911/files/extrapatch-bind-lmdb-lock b/dns/bind911/files/extrapatch-bind-lmdb-lock
new file mode 100644
index 000000000000..310881929cbd
--- /dev/null
+++ b/dns/bind911/files/extrapatch-bind-lmdb-lock
@@ -0,0 +1,235 @@
+--- bin/named/server.c.orig 2020-06-10 18:00:37 UTC
++++ bin/named/server.c
+@@ -6797,6 +6797,8 @@ count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, i
+ "for view '%s'",
+ view->new_zone_db, view->name);
+
++ LOCK(&view->new_zone_lock);
++
+ CHECK(nzd_count(view, &n));
+
+ *num_zonesp = n;
+@@ -6811,6 +6813,8 @@ count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, i
+ if (result != ISC_R_SUCCESS)
+ *num_zonesp = 0;
+
++ UNLOCK(&view->new_zone_lock);
++
+ return (ISC_R_SUCCESS);
+ }
+
+@@ -7116,6 +7120,8 @@ typedef isc_result_t (*newzone_cfg_cb_t)(const cfg_obj
+ * Immediately interrupt processing if an error is encountered while
+ * transforming NZD data into a zone configuration object or if "callback"
+ * returns an error.
++ *
++ * Caller must hold 'view->new_zone_lock'.
+ */
+ static isc_result_t
+ for_all_newzone_cfgs(newzone_cfg_cb_t callback, cfg_obj_t *config,
+@@ -7228,8 +7234,11 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config
+ return (ISC_R_SUCCESS);
+ }
+
++ LOCK(&view->new_zone_lock);
++
+ result = nzd_open(view, MDB_RDONLY, &txn, &dbi);
+ if (result != ISC_R_SUCCESS) {
++ UNLOCK(&view->new_zone_lock);
+ return (ISC_R_SUCCESS);
+ }
+
+@@ -7256,6 +7265,9 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config
+ }
+
+ (void) nzd_close(&txn, false);
++
++ UNLOCK(&view->new_zone_lock);
++
+ return (result);
+ }
+
+@@ -7277,6 +7289,8 @@ get_newzone_config(dns_view_t *view, const char *zonen
+
+ INSIST(zoneconfig != NULL && *zoneconfig == NULL);
+
++ LOCK(&view->new_zone_lock);
++
+ CHECK(nzd_open(view, MDB_RDONLY, &txn, &dbi));
+
+ isc_log_write(ns_g_lctx,
+@@ -7310,6 +7324,8 @@ get_newzone_config(dns_view_t *view, const char *zonen
+ cleanup:
+ (void) nzd_close(&txn, false);
+
++ UNLOCK(&view->new_zone_lock);
++
+ if (zoneconf != NULL) {
+ cfg_obj_destroy(ns_g_addparser, &zoneconf);
+ }
+@@ -11638,8 +11654,6 @@ nzd_save(MDB_txn **txnp, MDB_dbi dbi, dns_zone_t *zone
+
+ nzd_setkey(&key, dns_zone_getorigin(zone), namebuf, sizeof(namebuf));
+
+- LOCK(&view->new_zone_lock);
+-
+ if (zconfig == NULL) {
+ /* We're deleting the zone from the database */
+ status = mdb_del(*txnp, dbi, &key, NULL);
+@@ -11739,8 +11753,6 @@ nzd_save(MDB_txn **txnp, MDB_dbi dbi, dns_zone_t *zone
+ }
+ *txnp = NULL;
+
+- UNLOCK(&view->new_zone_lock);
+-
+ if (text != NULL) {
+ isc_buffer_free(&text);
+ }
+@@ -11748,6 +11760,11 @@ nzd_save(MDB_txn **txnp, MDB_dbi dbi, dns_zone_t *zone
+ return (result);
+ }
+
++/*
++ * Check whether the new zone database for 'view' can be opened for writing.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_writable(dns_view_t *view) {
+ isc_result_t result = ISC_R_SUCCESS;
+@@ -11779,6 +11796,11 @@ nzd_writable(dns_view_t *view) {
+ return (result);
+ }
+
++/*
++ * Open the new zone database for 'view' and start a transaction for it.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_open(dns_view_t *view, unsigned int flags, MDB_txn **txnp, MDB_dbi *dbi) {
+ int status;
+@@ -11909,6 +11931,13 @@ nzd_env_reopen(dns_view_t *view) {
+ return (result);
+ }
+
++/*
++ * If 'commit' is true, commit the new zone database transaction pointed to by
++ * 'txnp'; otherwise, abort that transaction.
++ *
++ * Caller must hold 'view->new_zone_lock' for the view that the transaction
++ * pointed to by 'txnp' was started for.
++ */
+ static isc_result_t
+ nzd_close(MDB_txn **txnp, bool commit) {
+ isc_result_t result = ISC_R_SUCCESS;
+@@ -11931,6 +11960,12 @@ nzd_close(MDB_txn **txnp, bool commit) {
+ return (result);
+ }
+
++/*
++ * Count the zones configured in the new zone database for 'view' and store the
++ * result in 'countp'.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_count(dns_view_t *view, int *countp) {
+ isc_result_t result;
+@@ -11979,6 +12014,8 @@ migrate_nzf(dns_view_t *view) {
+ MDB_val key, data;
+ ns_dzarg_t dzarg;
+
++ LOCK(&view->new_zone_lock);
++
+ /*
+ * If NZF file doesn't exist, or NZD DB exists and already
+ * has data, return without attempting migration.
+@@ -12122,6 +12159,8 @@ migrate_nzf(dns_view_t *view) {
+ result = nzd_close(&txn, commit);
+ }
+
++ UNLOCK(&view->new_zone_lock);
++
+ if (text != NULL) {
+ isc_buffer_free(&text);
+ }
+@@ -12325,6 +12364,7 @@ do_addzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_
+ MDB_dbi dbi;
+
+ UNUSED(zoneconf);
++ LOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+
+ /* Zone shouldn't already exist */
+@@ -12465,6 +12505,7 @@ do_addzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_
+ #else /* HAVE_LMDB */
+ if (txn != NULL)
+ (void) nzd_close(&txn, false);
++ UNLOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+
+ if (zone != NULL)
+@@ -12488,6 +12529,7 @@ do_modzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_
+ #else /* HAVE_LMDB */
+ MDB_txn *txn = NULL;
+ MDB_dbi dbi;
++ LOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+
+ /* Zone must already exist */
+@@ -12667,6 +12709,7 @@ do_modzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_
+ #else /* HAVE_LMDB */
+ if (txn != NULL)
+ (void) nzd_close(&txn, false);
++ UNLOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+
+ if (zone != NULL)
+@@ -12816,6 +12859,7 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ if (added && cfg != NULL) {
+ #ifdef HAVE_LMDB
+ /* Make sure we can open the NZD database */
++ LOCK(&view->new_zone_lock);
+ result = nzd_open(view, 0, &txn, &dbi);
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+@@ -12834,6 +12878,11 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ "delete zone configuration: %s",
+ isc_result_totext(result));
+ }
++
++ if (txn != NULL) {
++ (void)nzd_close(&txn, false);
++ }
++ UNLOCK(&view->new_zone_lock);
+ #else
+ result = delete_zoneconf(view, cfg->add_parser,
+ cfg->nzf_config,
+@@ -12926,10 +12975,6 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ }
+ }
+
+-#ifdef HAVE_LMDB
+- if (txn != NULL)
+- (void) nzd_close(&txn, false);
+-#endif
+ if (raw != NULL)
+ dns_zone_detach(&raw);
+ dns_zone_detach(&zone);
+--- lib/dns/include/dns/view.h.orig 2020-06-10 18:00:37 UTC
++++ lib/dns/include/dns/view.h
+@@ -240,12 +240,7 @@ struct dns_view {
+
+ #ifdef HAVE_LMDB
+ #include <lmdb.h>
+-/*
+- * MDB_NOTLS is used to prevent problems after configuration is reloaded, due
+- * to the way LMDB's use of thread-local storage (TLS) interacts with the BIND9
+- * thread model.
+- */
+-#define DNS_LMDB_COMMON_FLAGS (MDB_CREATE | MDB_NOSUBDIR | MDB_NOTLS)
++#define DNS_LMDB_COMMON_FLAGS (MDB_CREATE | MDB_NOSUBDIR | MDB_NOLOCK)
+ #ifndef __OpenBSD__
+ #define DNS_LMDB_FLAGS (DNS_LMDB_COMMON_FLAGS)
+ #else /* __OpenBSD__ */