From 825b976ee30a53e89fe747b4a3ba8f2eb862047c Mon Sep 17 00:00:00 2001 From: Santosh Kumar Pradhan Date: Thu, 2 Jan 2014 20:55:59 +0530 Subject: gNFS: Small memory leak in rpcsvc_drc_init() 1. The routine rpcsvc_drc_init() is only used while initialization of NFS xlator. It should just check for nfs.drc option and init DRC feature accordingly. If it's set to OFF, then rpcsvc_drc_init() allocates memory for svc.drc and set ret value to 0 and goes to out: block where drc is leaked. 2. rpcsvc_drc_init() should just allocate svc.drc and init it. Here svc.drc can never be valid. 3. If svc.drc gets init'd here, no point of checking for drc type here. Change-Id: I4085771cdb8c9c15d1b9c548b77929a37f27c124 BUG: 1047902 Signed-off-by: Santosh Kumar Pradhan Reviewed-on: http://review.gluster.org/6628 Reviewed-by: Niels de Vos Reviewed-by: Rajesh Joseph Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- rpc/rpc-lib/src/rpc-drc.c | 42 +++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 25 deletions(-) (limited to 'rpc') diff --git a/rpc/rpc-lib/src/rpc-drc.c b/rpc/rpc-lib/src/rpc-drc.c index e7ba114dd..7e77e038e 100644 --- a/rpc/rpc-lib/src/rpc-drc.c +++ b/rpc/rpc-lib/src/rpc-drc.c @@ -712,38 +712,30 @@ rpcsvc_drc_init (rpcsvc_t *svc, dict_t *options) GF_ASSERT (svc); GF_ASSERT (options); - if (!svc->drc) { - drc = GF_CALLOC (1, sizeof (rpcsvc_drc_globals_t), - gf_common_mt_drc_globals_t); - if (!drc) - return -1; - - svc->drc = drc; - LOCK_INIT (&drc->lock); - } else { - drc = svc->drc; - } - - LOCK (&drc->lock); - if (drc->type != DRC_TYPE_NONE) { - ret = 0; - goto out; - } - /* Toggle DRC on/off, when more drc types(persistent/cluster) are added, we shouldn't treat this as boolean */ ret = dict_get_str_boolean (options, "nfs.drc", _gf_true); if (ret == -1) { - gf_log (GF_RPCSVC, GF_LOG_INFO, "drc user options need second look"); + gf_log (GF_RPCSVC, GF_LOG_INFO, + "drc user options need second look"); ret = _gf_true; } - if (ret == _gf_false) { - /* drc off */ - gf_log (GF_RPCSVC, GF_LOG_INFO, "DRC is manually turned OFF"); - ret = 0; - goto out; - } + gf_log (GF_RPCSVC, GF_LOG_INFO, "DRC is turned %s", (ret?"ON":"OFF")); + + /*DRC off, nothing to do */ + if (ret == _gf_false) + return (0); + + drc = GF_CALLOC (1, sizeof (rpcsvc_drc_globals_t), + gf_common_mt_drc_globals_t); + if (!drc) + return (-1); + + LOCK_INIT (&drc->lock); + svc->drc = drc; + + LOCK (&drc->lock); /* Specify type of DRC to be used */ ret = dict_get_uint32 (options, "nfs.drc-type", &drc_type); -- cgit