From: Vsevolod Stakhov Date: Mon, 16 Jan 2017 14:27:39 +0000 (+0000) Subject: [CritFix] Fix descriptors leak on reload X-Git-Tag: 1.4.3~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e50557d57d638f31a679942e7bc4c7c5d8bb3cf;p=thirdparty%2Frspamd.git [CritFix] Fix descriptors leak on reload MFH: true --- diff --git a/src/libutil/logger.c b/src/libutil/logger.c index 082c12d147..8b98e368f0 100644 --- a/src/libutil/logger.c +++ b/src/libutil/logger.c @@ -73,6 +73,7 @@ struct rspamd_logger_s { gboolean is_debug; gboolean throttling; gboolean no_lock; + gboolean opened; time_t throttling_time; enum rspamd_log_type type; pid_t pid; @@ -202,18 +203,18 @@ rspamd_escape_log_string (gchar *str) gint rspamd_log_open_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid) { - switch (rspamd_log->cfg->log_type) { + if (!rspamd_log->opened) { + switch (rspamd_log->cfg->log_type) { case RSPAMD_LOG_CONSOLE: /* Do nothing with console */ rspamd_log->enabled = TRUE; - return 0; + break; case RSPAMD_LOG_SYSLOG: #ifdef HAVE_SYSLOG_H openlog ("rspamd", LOG_NDELAY | LOG_PID, rspamd_log->cfg->log_facility); - rspamd_log->enabled = TRUE; #endif - return 0; + break; case RSPAMD_LOG_FILE: rspamd_log->fd = open (rspamd_log->cfg->log_file, O_CREAT | O_WRONLY | O_APPEND, @@ -231,10 +232,16 @@ rspamd_log_open_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid) close (rspamd_log->fd); return -1; } - rspamd_log->enabled = TRUE; - return 0; + break; + default: + return -1; + } + + rspamd_log->opened = TRUE; + rspamd_log->enabled = TRUE; } - return -1; + + return 0; } void @@ -243,7 +250,8 @@ rspamd_log_close_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid) gchar tmpbuf[256]; rspamd_log_flush (rspamd_log); - switch (rspamd_log->type) { + if (rspamd_log->opened) { + switch (rspamd_log->type) { case RSPAMD_LOG_CONSOLE: /* Do nothing special */ break; @@ -283,7 +291,6 @@ rspamd_log_close_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid) rspamd_log->saved_loglevel | RSPAMD_LOG_FORCED, tmpbuf, rspamd_log); - return; } if (fsync (rspamd_log->fd) == -1) { @@ -292,15 +299,18 @@ rspamd_log_close_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid) close (rspamd_log->fd); } break; - } + } - rspamd_log->enabled = FALSE; + rspamd_log->enabled = FALSE; + rspamd_log->opened = FALSE; + } } gint rspamd_log_reopen_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid) { rspamd_log_close_priv (rspamd_log, uid, gid); + if (rspamd_log_open_priv (rspamd_log, uid, gid) == 0) { msg_info ("log file reopened"); return 0; diff --git a/src/rspamd.c b/src/rspamd.c index d9f2b9a76f..5708b20ef4 100644 --- a/src/rspamd.c +++ b/src/rspamd.c @@ -256,6 +256,9 @@ config_logger (rspamd_mempool_t *pool, gpointer ud) rspamd_set_logger (rspamd_main->cfg, g_quark_try_string ("main"), rspamd_main); + rspamd_log_close_priv (rspamd_main->logger, + rspamd_main->workers_uid, rspamd_main->workers_gid); + if (rspamd_log_open_priv (rspamd_main->logger, rspamd_main->workers_uid, rspamd_main->workers_gid) == -1) { fprintf (stderr, "Fatal error, cannot open logfile, exiting\n");