[collectd] [PATCH] perl plugin: Disable plugin after fatal configuration errors.

Sebastian Harl sh at tokkee.org
Tue Sep 16 15:40:14 CEST 2008


Currently, the only such case is the failure to bootstrap the Perl interpreter
and Collectd module. This fixes a segfault that happened when trying to
configure Perl plugins in that case.

Signed-off-by: Sebastian Harl <sh at tokkee.org>
---

This patch is for 4.5 and master only.

---
 src/perl.c |   27 +++++++++++++++++++--------
 1 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/perl.c b/src/perl.c
index e6f7de0..6d95082 100644
--- a/src/perl.c
+++ b/src/perl.c
@@ -1768,10 +1768,10 @@ static int perl_config_plugin (pTHX_ oconfig_item_t *ci)
 	if (0 < retvals) {
 		SV *tmp = POPs;
 		if (! SvTRUE (tmp))
-			ret = -1;
+			ret = 1;
 	}
 	else
-		ret = -1;
+		ret = 1;
 
 	PUTBACK;
 	FREETMPS;
@@ -1781,30 +1781,41 @@ static int perl_config_plugin (pTHX_ oconfig_item_t *ci)
 
 static int perl_config (oconfig_item_t *ci)
 {
+	int status = 0;
 	int i = 0;
 
 	dTHXa (NULL);
 
 	for (i = 0; i < ci->children_num; ++i) {
 		oconfig_item_t *c = ci->children + i;
+		int current_status;
 
 		if (NULL != perl_threads)
 			aTHX = PERL_GET_CONTEXT;
 
 		if (0 == strcasecmp (c->key, "LoadPlugin"))
-			perl_config_loadplugin (aTHX_ c);
+			current_status = perl_config_loadplugin (aTHX_ c);
 		else if (0 == strcasecmp (c->key, "BaseName"))
-			perl_config_basename (aTHX_ c);
+			current_status = perl_config_basename (aTHX_ c);
 		else if (0 == strcasecmp (c->key, "EnableDebugger"))
-			perl_config_enabledebugger (aTHX_ c);
+			current_status = perl_config_enabledebugger (aTHX_ c);
 		else if (0 == strcasecmp (c->key, "IncludeDir"))
-			perl_config_includedir (aTHX_ c);
+			current_status = perl_config_includedir (aTHX_ c);
 		else if (0 == strcasecmp (c->key, "Plugin"))
-			perl_config_plugin (aTHX_ c);
+			current_status = perl_config_plugin (aTHX_ c);
 		else
 			log_warn ("Ignoring unknown config key \"%s\".", c->key);
+
+		/* fatal error - it's up to perl_config_* to clean up */
+		if (0 > current_status) {
+			log_err ("Configuration failed with a fatal error - "
+					"plugin disabled!");
+			return current_status;
+		}
+
+		status += current_status;
 	}
-	return 0;
+	return status;
 } /* static int perl_config (oconfig_item_t *) */
 
 void module_register (void)
-- 
1.6.0.1.216.g1b23a

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mailman.verplant.org/pipermail/collectd/attachments/20080916/a8262569/attachment.pgp 


More information about the collectd mailing list