summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: aed9a00)
raw | patch | inline | side by side (parent: aed9a00)
author | Sebastian Harl <sh@tokkee.org> | |
Sun, 20 May 2007 20:58:03 +0000 (22:58 +0200) | ||
committer | Florian Forster <octo@huhu.verplant.org> | |
Mon, 21 May 2007 05:17:48 +0000 (07:17 +0200) |
If we do not unregister the callbacks there is still an entry point into the
plugin after Perl has been shut down and its memory has been freed. This will
cause segmentation faults if collectd tries to call any of the registered
callbacks, e.g. by some plugin calling plugin_log () during shutdown.
Important note: Unregistering the shutdown callback during shutdown is
somewhat tricky. Doing that frees the llist_t entry in plugin.c:list_shutdown.
This might cause a segfault in plugin_shutdown_all () when it tries to access
the next pointer of that entry. If plugin_unregister_shutdown () is the last
statement before the return from the shutdown callback this should be save in
about 99% of all cases. Still there should be some better way to handle this.
Signed-off-by: Sebastian Harl <sh@tokkee.org>
plugin after Perl has been shut down and its memory has been freed. This will
cause segmentation faults if collectd tries to call any of the registered
callbacks, e.g. by some plugin calling plugin_log () during shutdown.
Important note: Unregistering the shutdown callback during shutdown is
somewhat tricky. Doing that frees the llist_t entry in plugin.c:list_shutdown.
This might cause a segfault in plugin_shutdown_all () when it tries to access
the next pointer of that entry. If plugin_unregister_shutdown () is the last
statement before the return from the shutdown callback this should be save in
about 99% of all cases. Still there should be some better way to handle this.
Signed-off-by: Sebastian Harl <sh@tokkee.org>
src/perl.c | patch | blob | history |
diff --git a/src/perl.c b/src/perl.c
index 3be3762132f1a528ed517a6180f9ef3550255d16..bcf7bb17ed76add6ef8f680cf2511b3fbf123535 100644 (file)
--- a/src/perl.c
+++ b/src/perl.c
static int perl_config (const char *key, const char *value)
{
+ assert (NULL != perl);
+
log_debug ("perl_config: key = \"%s\", value=\"%s\"", key, value);
if (0 == strcasecmp (key, "LoadPlugin")) {
static int perl_init (void)
{
+ assert (NULL != perl);
+
PERL_SET_CONTEXT (perl);
return pplugin_call_all (PLUGIN_INIT);
} /* static int perl_init (void) */
static int perl_read (void)
{
+ assert (NULL != perl);
+
PERL_SET_CONTEXT (perl);
return pplugin_call_all (PLUGIN_READ);
} /* static int perl_read (void) */
static int perl_write (const data_set_t *ds, const value_list_t *vl)
{
+ assert (NULL != perl);
+
PERL_SET_CONTEXT (perl);
return pplugin_call_all (PLUGIN_WRITE, ds, vl);
} /* static int perl_write (const data_set_t *, const value_list_t *) */
static void perl_log (int level, const char *msg)
{
+ assert (NULL != perl);
+
PERL_SET_CONTEXT (perl);
pplugin_call_all (PLUGIN_LOG, level, msg);
return;
int i = 0;
int ret = 0;
+ plugin_unregister_log ("perl");
+ plugin_unregister_config ("perl");
+ plugin_unregister_init ("perl");
+ plugin_unregister_read ("perl");
+ plugin_unregister_write ("perl");
+
+ assert (NULL != perl);
+
PERL_SET_CONTEXT (perl);
ret = pplugin_call_all (PLUGIN_SHUTDOWN);
perl_destruct (perl);
perl_free (perl);
+ perl = NULL;
PERL_SYS_TERM ();
+
+ plugin_unregister_shutdown ("perl");
return ret;
} /* static void perl_shutdown (void) */