Hello,

attached patches fix
https://bugzilla.redhat.com/show_bug.cgi?id=1142150
https://bugzilla.redhat.com/show_bug.cgi?id=1142152

... and improve related error messages.

I will push it to https://github.com/spacekpe/bind-dynamic_db if you are okay with it.

--
Petr^2 Spacek
From d2d0b25e7586c306fc5e6ac62a82f680e70a91e8 Mon Sep 17 00:00:00 2001
From: Petr Spacek <pspa...@redhat.com>
Date: Tue, 16 Sep 2014 19:25:34 +0200
Subject: [PATCH] Fix error handling in configure_view() to prevent deadlocks.

Signed-off-by: Petr Spacek <pspa...@redhat.com>
---
 bin/named/server.c               |  8 +++-----
 lib/dns/dynamic_db.c             | 10 +++++++++-
 lib/dns/include/dns/dynamic_db.h |  2 +-
 3 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/bin/named/server.c b/bin/named/server.c
index 6236c1014f07bdb826308290d98a0c5112732b31..0ea512b4b7673a1bf3a88506c6922e5d74d6b909 100644
--- a/bin/named/server.c
+++ b/bin/named/server.c
@@ -2178,6 +2178,7 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
 	unsigned int query_timeout, ndisp;
 	struct cfg_context *nzctx;
 	dns_rpz_zone_t *rpz;
+	dns_dyndb_arguments_t *args = NULL;
 
 	REQUIRE(DNS_VIEW_VALID(view));
 
@@ -3341,8 +3342,6 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
 		(void)cfg_map_get(config, "dynamic-db", &dynamic_db_list);
 	element = cfg_list_first(dynamic_db_list);
 	if (element != NULL) {
-		dns_dyndb_arguments_t *args;
-
 		args = dns_dyndb_arguments_create(mctx);
 		if (args == NULL) {
 			result = ISC_R_NOMEMORY;
@@ -3355,11 +3354,8 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
 		while (element != NULL) {
 			obj = cfg_listelt_value(element);
 			CHECK(configure_dynamic_db(obj, mctx, args));
-
 			element = cfg_list_next(element);
 		}
-
-		dns_dyndb_arguments_destroy(mctx, args);
 	}
 
 	/*
@@ -3547,6 +3543,8 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
 
 	if (cache != NULL)
 		dns_cache_detach(&cache);
+	if (args != NULL)
+		dns_dyndb_arguments_destroy(mctx, &args);
 
 	return (result);
 }
diff --git a/lib/dns/dynamic_db.c b/lib/dns/dynamic_db.c
index bf831617b391778ec540b2a5ca0df341937f2427..30c56a65c7227497c3e772c3e1b58ff49eacbd35 100644
--- a/lib/dns/dynamic_db.c
+++ b/lib/dns/dynamic_db.c
@@ -280,16 +280,24 @@ dns_dyndb_arguments_create(isc_mem_t *mctx)
 }
 
 void
-dns_dyndb_arguments_destroy(isc_mem_t *mctx, dns_dyndb_arguments_t *args)
+dns_dyndb_arguments_destroy(isc_mem_t *mctx, dns_dyndb_arguments_t **argsp)
 {
+	dns_dyndb_arguments_t *args;
+
 	REQUIRE(args != NULL);
 
+	args = *argsp;
+	if (args == NULL)
+		return;
+
 	dns_dyndb_set_view(args, NULL);
 	dns_dyndb_set_zonemgr(args, NULL);
 	dns_dyndb_set_task(args, NULL);
 	dns_dyndb_set_timermgr(args, NULL);
 
 	isc_mem_put(mctx, args, sizeof(*args));
+
+	*argsp = NULL;
 }
 
 void
diff --git a/lib/dns/include/dns/dynamic_db.h b/lib/dns/include/dns/dynamic_db.h
index 673ad4bc12bfe0875d7bac69a219574e11674bcf..e50491d33c4cd4a9e600110926349af32622c24a 100644
--- a/lib/dns/include/dns/dynamic_db.h
+++ b/lib/dns/include/dns/dynamic_db.h
@@ -35,7 +35,7 @@ isc_result_t dns_dynamic_db_load(const char *libname, const char *name,
 void dns_dynamic_db_cleanup(isc_boolean_t exiting);
 
 dns_dyndb_arguments_t *dns_dyndb_arguments_create(isc_mem_t *mctx);
-void dns_dyndb_arguments_destroy(isc_mem_t *mctx, dns_dyndb_arguments_t *args);
+void dns_dyndb_arguments_destroy(isc_mem_t *mctx, dns_dyndb_arguments_t **args);
 
 void dns_dyndb_set_view(dns_dyndb_arguments_t *args, dns_view_t *view);
 dns_view_t *dns_dyndb_get_view(dns_dyndb_arguments_t *args);
-- 
1.9.3

From 378bdc0646e1738b39f5da2e26da7753d7b562a6 Mon Sep 17 00:00:00 2001
From: Petr Spacek <pspa...@redhat.com>
Date: Tue, 16 Sep 2014 19:26:03 +0200
Subject: [PATCH] Log error if dynamic database configuration failed.

Signed-off-by: Petr Spacek <pspa...@redhat.com>
---
 bin/named/server.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/bin/named/server.c b/bin/named/server.c
index 0ea512b4b7673a1bf3a88506c6922e5d74d6b909..590b32923b8fdfd68caabfc57a1dbd127a234ce3 100644
--- a/bin/named/server.c
+++ b/bin/named/server.c
@@ -1308,6 +1308,11 @@ configure_dynamic_db(const cfg_obj_t *dynamic_db, isc_mem_t *mctx,
 	CHECK(dns_dynamic_db_load(libname, name, mctx, argv, dyndb_args));
 
 cleanup:
+	if (result != ISC_R_SUCCESS)
+		isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+		              NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+		              "dynamic database '%s' configuration failed: %s",
+		              name, isc_result_totext(result));
 	if (argv != NULL)
 		isc_mem_free(mctx, argv);
 
-- 
1.9.3

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to