cluster: RHEL6 - rgmanager: Fix segfault on config reload

Fabio M. Di Nitto fabbione at fedoraproject.org
Wed Jul 13 08:04:15 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=b879d60438c33353f729d116ed332bf9e79c4692
Commit:        b879d60438c33353f729d116ed332bf9e79c4692
Parent:        c4e8a5cd840550bb3457eed25f167afc2531ae12
Author:        Yevheniy Demchenko <zheka at uvt.cz>
AuthorDate:    Wed Jul 6 13:38:09 2011 -0400
Committer:     Fabio M. Di Nitto <fdinitto at redhat.com>
CommitterDate: Wed Jul 13 09:55:05 2011 +0200

rgmanager: Fix segfault on config reload

This issue was initially triggered by rpm package which wrongly
set executable flag on resource-script.metadata file in
/usr/share/cluster/. After running "cman_tool version -r" cluster
crashed, last log entry was:

  rgmanager[47960]: Loading Service Data

Further investigation has shown, that this behaviour is triggered
always if any runnable file in /usr/share/cluster provides output
which is not well formed XML when run with the meta-data operation.

This behaviour is probably caused by the wrong usage of
xmlInitParser()/XmlCleanUp() parser.

Resolves: rhbz#692895

Signed-off-by: Yevheniy Demchenko <zheka at uvt.cz>
Reviewed-by: Lon Hohberger <lhh at redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto at redhat.com>
Tested-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/src/daemons/main.c     |    2 ++
 rgmanager/src/daemons/resrules.c |    2 --
 rgmanager/src/daemons/rg_locks.c |    2 --
 3 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/rgmanager/src/daemons/main.c b/rgmanager/src/daemons/main.c
index a3ab7c4..3c39c46 100644
--- a/rgmanager/src/daemons/main.c
+++ b/rgmanager/src/daemons/main.c
@@ -1034,6 +1034,7 @@ main(int argc, char **argv)
 	   We know we're quorate.  At this point, we need to
 	   read the resource group trees from ccsd.
 	 */
+	xmlInitParser();
 	configure_rgmanager(-1, debug, &cluster_timeout);
 	logt_print(LOG_NOTICE, "Resource Group Manager Starting\n");
 
@@ -1114,6 +1115,7 @@ main(int argc, char **argv)
 	if (rg_initialized())
 		cleanup(cluster_ctx);
 	rv = 0;
+	xmlCleanupParser();
 out_ls:
 	clu_lock_finished(rgmanager_lsname);
 
diff --git a/rgmanager/src/daemons/resrules.c b/rgmanager/src/daemons/resrules.c
index 41bb6e8..142cfcd 100644
--- a/rgmanager/src/daemons/resrules.c
+++ b/rgmanager/src/daemons/resrules.c
@@ -1133,7 +1133,6 @@ load_resource_rules(const char *rpath, resource_rule_t **rules)
 	if (!dir)
 		return -1;
 
-	xmlInitParser();
 	while ((de = readdir(dir))) {
 		
 		fn = basename(de->d_name);
@@ -1171,7 +1170,6 @@ load_resource_rules(const char *rpath, resource_rule_t **rules)
    			load_resource_rulefile(path, rules);
   		}
 	}
-	xmlCleanupParser();
 
 	closedir(dir);
 
diff --git a/rgmanager/src/daemons/rg_locks.c b/rgmanager/src/daemons/rg_locks.c
index f2d1050..14bd241 100644
--- a/rgmanager/src/daemons/rg_locks.c
+++ b/rgmanager/src/daemons/rg_locks.c
@@ -115,9 +115,7 @@ ccs_lock(void)
 #else /* No ccs support */
 {
 	pthread_mutex_lock(&_ccs_mutex);
-	xmlInitParser();
        	ccs_doc = xmlParseFile(conffile);
-	xmlCleanupParser();
 	if (!ccs_doc)
 		return -1;
 	return 0;


More information about the cluster-commits mailing list