From a4a417e29c5b2d63e6bf5efae4f0ccf30a39647f Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Mon, 10 Jul 2017 11:45:31 +0200 Subject: gfapi: prevent mem-pool leak in case glfs_new_fs() fails Commit 7039243e187 adds a call to mem_pools_init() so that the memory pool cleanup thread ("sweeper") is started. However, now it is possible that users of gfapi can not cleanup this thread because glfs_new() can return NULL, but the sweeper is still running. In case glfs_fs_new() fails, mem_pools_fini() needs to be called as well. This seems more correct than calling mem_pools_init() after glfs_fs_new(), and this makes using memory pools possible *really* early in the gfapi initialization. Change-Id: I1f2fb25cc33e227b3c33ce9d1b03f67bc27e981a Fixes: 7039243e187 ("gfapi: add mem_pools_init and mem_pools_fini calls") BUG: 1468863 Signed-off-by: Niels de Vos Reviewed-on: https://review.gluster.org/17734 Reviewed-by: Jeff Darcy Reviewed-by: Vijay Bellur CentOS-regression: Gluster Build System Smoke: Gluster Build System Reviewed-by: soumya k Reviewed-by: Amar Tumballi --- api/src/glfs.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'api') diff --git a/api/src/glfs.c b/api/src/glfs.c index 0eb25a222de..25eaabb066c 100644 --- a/api/src/glfs.c +++ b/api/src/glfs.c @@ -753,45 +753,54 @@ pub_glfs_new (const char *volname) fs = glfs_new_fs (volname); if (!fs) - return NULL; + goto out; ctx = glusterfs_ctx_new (); if (!ctx) - goto fini; + goto out; /* first globals init, for gf_mem_acct_enable_set () */ ret = glusterfs_globals_init (ctx); if (ret) - goto fini; + goto out; old_THIS = THIS; ret = glfs_init_global_ctx (); if (ret) - goto fini; + goto out; /* then ctx_defaults_init, for xlator_mem_acct_init(THIS) */ ret = glusterfs_ctx_defaults_init (ctx); if (ret) - goto fini; + goto out; fs->ctx = ctx; ret = glfs_set_logging (fs, "/dev/null", 0); if (ret) - goto fini; + goto out; fs->ctx->cmd_args.volfile_id = gf_strdup (volname); - if (!(fs->ctx->cmd_args.volfile_id)) - goto fini; + if (!(fs->ctx->cmd_args.volfile_id)) { + ret = -1; + goto out; + } - goto out; + ret = 0; -fini: - glfs_fini (fs); - fs = NULL; out: + if (ret) { + if (fs) { + glfs_fini (fs); + fs = NULL; + } else { + /* glfs_fini() calls mem_pools_fini() too */ + mem_pools_fini (); + } + } + if (old_THIS) THIS = old_THIS; -- cgit