summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: b356d01)
raw | patch | inline | side by side (parent: b356d01)
author | Sebastian Harl <sh@tokkee.org> | |
Wed, 8 Sep 2010 20:14:19 +0000 (22:14 +0200) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Wed, 8 Sep 2010 20:21:37 +0000 (22:21 +0200) |
This is an upstream patch fixing a segfault in the 'notify_email' plugin.
Thanks to Manuel CISSE for reporting this!
Closes: #595756
Thanks to Manuel CISSE for reporting this!
Closes: #595756
debian/changelog | patch | blob | history | |
debian/patches/00list | patch | blob | history | |
debian/patches/bts595756-notify_email-segfault.dpatch | [new file with mode: 0755] | patch | blob |
diff --git a/debian/changelog b/debian/changelog
index d5c81ddbc5f864033e747487cdd5ab4ccf6ad839..6a55b3054d599e3c02ced41577966b7b50a510ef 100644 (file)
--- a/debian/changelog
+++ b/debian/changelog
+collectd (4.10.1-2) unstable; urgency=low
+
+ * debian/patches:
+ - Added bts595756-notify_email-segfault -- upstream patch fixing a
+ segfault in the 'notify_email' plugin; thanks to Manuel CISSE for
+ reporting this (Closes: #595756).
+
+ -- Sebastian Harl <tokkee@debian.org> Wed, 08 Sep 2010 22:12:56 +0200
+
collectd (4.10.1-1) unstable; urgency=low
* New upstream release.
diff --git a/debian/patches/00list b/debian/patches/00list
index de365fe478a465b354f7565e8c3615cfe40017d5..f781a027107a130345e2e20befafe38a55f13e81 100644 (file)
--- a/debian/patches/00list
+++ b/debian/patches/00list
rrd_filter_path.dpatch
collection_conf_path.dpatch
bts559801_plugin_find_fix.dpatch
+bts595756-notify_email-segfault.dpatch
diff --git a/debian/patches/bts595756-notify_email-segfault.dpatch b/debian/patches/bts595756-notify_email-segfault.dpatch
--- /dev/null
@@ -0,0 +1,140 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## bts595756-notify_email-segfault.dpatch
+## by Florian Forster <octo@verplant.org>
+##
+## DP: notify_email plugin: Serialize all accesses to libesmtp using a mutex.
+## DP:
+## DP: libesmtp is not thread-safe. This fixes segfaults when accessing the
+## DP: plugin in parallel.
+
+@DPATCH@
+
+diff a/src/notify_email.c b/src/notify_email.c
+--- a/src/notify_email.c
++++ b/src/notify_email.c
+@@ -1,6 +1,7 @@
+ /**
+ * collectd - src/notify_email.c
+ * Copyright (C) 2008 Oleg King
++ * Copyright (C) 2010 Florian Forster
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+@@ -18,6 +19,7 @@
+ *
+ * Authors:
+ * Oleg King <king2 at kaluga.ru>
++ * Florian Forster <octo at collectd.org>
+ **/
+
+ #include "collectd.h"
+@@ -26,6 +28,7 @@
+
+ #include <auth-client.h>
+ #include <libesmtp.h>
++#include <pthread.h>
+
+ #define MAXSTRING 256
+
+@@ -45,6 +48,7 @@ static char **recipients;
+ static int recipients_len = 0;
+
+ static smtp_session_t session;
++static pthread_mutex_t session_lock = PTHREAD_MUTEX_INITIALIZER;
+ static smtp_message_t message;
+ static auth_context_t authctx = NULL;
+
+@@ -113,17 +117,23 @@ static int notify_email_init (void)
+ {
+ char server[MAXSTRING];
+
++ ssnprintf(server, sizeof (server), "%s:%i",
++ (smtp_host == NULL) ? DEFAULT_SMTP_HOST : smtp_host,
++ smtp_port);
++
++ pthread_mutex_lock (&session_lock);
++
+ auth_client_init();
+- if (!(session = smtp_create_session ())) {
++
++ session = smtp_create_session ();
++ if (session == NULL) {
++ pthread_mutex_unlock (&session_lock);
+ ERROR ("notify_email plugin: cannot create SMTP session");
+ return (-1);
+ }
+
+ smtp_set_monitorcb (session, monitor_cb, NULL, 1);
+ smtp_set_hostname (session, hostname_g);
+- ssnprintf(server, sizeof (server), "%s:%i",
+- (smtp_host == NULL) ? DEFAULT_SMTP_HOST : smtp_host,
+- smtp_port);
+ smtp_set_server (session, server);
+
+ if (smtp_user && smtp_password) {
+@@ -133,18 +143,30 @@ static int notify_email_init (void)
+ }
+
+ if ( !smtp_auth_set_context (session, authctx)) {
++ pthread_mutex_unlock (&session_lock);
+ ERROR ("notify_email plugin: cannot set SMTP auth context");
+ return (-1);
+ }
+
++ pthread_mutex_unlock (&session_lock);
+ return (0);
+ } /* int notify_email_init */
+
+ static int notify_email_shutdown (void)
+ {
+- smtp_destroy_session (session);
+- auth_destroy_context (authctx);
++ pthread_mutex_lock (&session_lock);
++
++ if (session != NULL)
++ smtp_destroy_session (session);
++ session = NULL;
++
++ if (authctx != NULL)
++ auth_destroy_context (authctx);
++ authctx = NULL;
++
+ auth_client_exit();
++
++ pthread_mutex_unlock (&session_lock);
+ return (0);
+ } /* int notify_email_shutdown */
+
+@@ -248,7 +270,16 @@ static int notify_email_notification (const notification_t *n,
+ n->host,
+ n->message);
+
++ pthread_mutex_lock (&session_lock);
++
++ if (session == NULL) {
++ /* Initialization failed or we're in the process of shutting down. */
++ pthread_mutex_unlock (&session_lock);
++ return (-1);
++ }
++
+ if (!(message = smtp_add_message (session))) {
++ pthread_mutex_unlock (&session_lock);
+ ERROR ("notify_email plugin: cannot set SMTP message");
+ return (-1);
+ }
+@@ -264,6 +295,7 @@ static int notify_email_notification (const notification_t *n,
+ char buf[MAXSTRING];
+ ERROR ("notify_email plugin: SMTP server problem: %s",
+ smtp_strerror (smtp_errno (), buf, sizeof buf));
++ pthread_mutex_unlock (&session_lock);
+ return (-1);
+ } else {
+ const smtp_status_t *status;
+@@ -274,6 +306,7 @@ static int notify_email_notification (const notification_t *n,
+ smtp_enumerate_recipients (message, print_recipient_status, NULL);
+ }
+
++ pthread_mutex_unlock (&session_lock);
+ return (0);
+ } /* int notify_email_notification */
+