From 0d7279d32d5f55c0210bdcfda2d3f83e35f524b6 Mon Sep 17 00:00:00 2001 From: Poornima G Date: Mon, 23 Dec 2013 05:11:15 +0000 Subject: gfapi: Closed the logfile fd and initialize to NULL in glfs_fini Currently if logfile is closed and other threads call gf_log after glfs_fini() is executed, it may lead to memory corruption. Adding gf_log_fini() which closes the logfile and initializes the logfile to NULL, thus any further logging happens to stderr. Also added gf_log_globals_fini() which should be filled in the future to release all the logging resources. Change-Id: I879163e1a3636e65300d166f782517ee773cab65 BUG: 1030228 Signed-off-by: Poornima G Reviewed-on: http://review.gluster.org/6552 Reviewed-by: Pranith Kumar Karampuri Reviewed-by: Shyamsundar Ranganathan Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- api/src/glfs.c | 4 ++-- libglusterfs/src/logging.c | 35 ++++++++++++++++++++++++++++++++++- libglusterfs/src/logging.h | 2 ++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/api/src/glfs.c b/api/src/glfs.c index 29ed47c0c..1bae78d23 100644 --- a/api/src/glfs.c +++ b/api/src/glfs.c @@ -666,8 +666,8 @@ glfs_fini (struct glfs *fs) glfs_subvol_done (fs, subvol); - if (ctx->log.logfile) - fclose (ctx->log.logfile); + if (gf_log_fini(ctx) != 0) + ret = -1; return ret; } diff --git a/libglusterfs/src/logging.c b/libglusterfs/src/logging.c index e3a4a9fde..0058233a7 100644 --- a/libglusterfs/src/logging.c +++ b/libglusterfs/src/logging.c @@ -108,11 +108,44 @@ gf_log_set_xl_loglevel (void *this, gf_loglevel_t level) } void -gf_log_fini (void) +gf_log_globals_fini (void) { pthread_mutex_destroy (&THIS->ctx->log.logfile_mutex); } +/** gf_log_fini - function to perform the cleanup of the log information + * @data - glusterfs context + * @return: success: 0 + * failure: -1 + */ +int +gf_log_fini (void *data) +{ + glusterfs_ctx_t *ctx = data; + int ret = 0; + + if (ctx == NULL) { + ret = -1; + goto out; + } + + pthread_mutex_lock (&ctx->log.logfile_mutex); + { + if (ctx->log.logfile) { + if (fclose (ctx->log.logfile) != 0) + ret = -1; + /* Logfile needs to be set to NULL, so that any + call to gf_log after calling gf_log_fini, will + log the message to stderr. + */ + ctx->log.logfile = NULL; + } + } + pthread_mutex_unlock (&ctx->log.logfile_mutex); + + out: + return ret; +} #ifdef GF_USE_SYSLOG /** diff --git a/libglusterfs/src/logging.h b/libglusterfs/src/logging.h index cc806a767..e2b7e664d 100644 --- a/libglusterfs/src/logging.h +++ b/libglusterfs/src/logging.h @@ -153,6 +153,8 @@ int gf_cmd_log_init (const char *filename); void set_sys_log_level (gf_loglevel_t level); +int gf_log_fini(void *data); + #define GF_DEBUG(xl, format, args...) \ gf_log ((xl)->name, GF_LOG_DEBUG, format, ##args) #define GF_INFO(xl, format, args...) \ -- cgit