From 843d92b034b7303d818e222506bc165fb4f1fd22 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Tue, 16 Sep 2008 15:40:14 +0200 Subject: [PATCH] perl plugin: Disable plugin after fatal configuration errors. 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 Signed-off-by: Florian Forster --- src/perl.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/perl.c b/src/perl.c index e6f7de0e..6d950824 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) -- 2.30.2