diff options
author | Prasanna Kumar Kalever <prasanna.kalever@redhat.com> | 2016-05-23 14:31:51 +0530 |
---|---|---|
committer | Jeff Darcy <jdarcy@redhat.com> | 2016-06-01 06:28:48 -0700 |
commit | a04eaf366779a0632e5b9cdd6d63de0eb62f7449 (patch) | |
tree | 5a5345b9c4ec3b5037f7a3ac1aae93093aa2392d | |
parent | 46c0b791d528bebf1168972a34f7483bfe683ba3 (diff) |
__inode_ctx_put: fix mem leak on failure
up on failure case __inode_ctx_put need to free the allocated memory
Indirect leak of 104 byte(s) in 1 object(s) allocated from:
#0 0x496669 in __interceptor_calloc (/usr/local/sbin/glusterfsd+0x496669)
#1 0x7f8a288522f9 in __gf_calloc libglusterfs/src/mem-pool.c:117
#2 0x7f8a17235962 in __posix_acl_ctx_get xlators/system/posix-acl/src/posix-acl.c:308
Change-Id: I0ce6da3967c55931a70f77d8551ccf52e4cdfda3
BUG: 1338733
Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
Reviewed-on: http://review.gluster.org/14505
Tested-by: Prasanna Kumar Kalever <pkalever@redhat.com>
Smoke: Gluster Build System <jenkins@build.gluster.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
-rw-r--r-- | xlators/features/locks/src/common.c | 7 | ||||
-rw-r--r-- | xlators/features/quota/src/quota.c | 3 | ||||
-rw-r--r-- | xlators/performance/write-behind/src/write-behind.c | 7 | ||||
-rw-r--r-- | xlators/system/posix-acl/src/posix-acl.c | 4 |
4 files changed, 18 insertions, 3 deletions
diff --git a/xlators/features/locks/src/common.c b/xlators/features/locks/src/common.c index facb078612f..4a9b138cb80 100644 --- a/xlators/features/locks/src/common.c +++ b/xlators/features/locks/src/common.c @@ -434,7 +434,12 @@ pl_inode_get (xlator_t *this, inode_t *inode) INIT_LIST_HEAD (&pl_inode->blocked_calls); gf_uuid_copy (pl_inode->gfid, inode->gfid); - __inode_ctx_put (inode, this, (uint64_t)(long)(pl_inode)); + ret = __inode_ctx_put (inode, this, (uint64_t)(long)(pl_inode)); + if (ret) { + GF_FREE (pl_inode); + pl_inode = NULL; + goto unlock; + } } unlock: UNLOCK (&inode->lock); diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c index e67a4325fc7..22d1bb9f30f 100644 --- a/xlators/features/quota/src/quota.c +++ b/xlators/features/quota/src/quota.c @@ -40,10 +40,11 @@ __quota_init_inode_ctx (inode_t *inode, xlator_t *this, INIT_LIST_HEAD (&ctx->parents); ret = __inode_ctx_put (inode, this, (uint64_t )(long)ctx); - if (ret == -1) { + if (ret) { gf_msg (this->name, GF_LOG_WARNING, 0, Q_MSG_INODE_CTX_SET_FAILED, "cannot set quota context " "in inode (gfid:%s)", uuid_utoa (inode->gfid)); + GF_FREE (ctx); } out: return ret; diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c index c47b537c4fc..98b448be332 100644 --- a/xlators/performance/write-behind/src/write-behind.c +++ b/xlators/performance/write-behind/src/write-behind.c @@ -592,6 +592,7 @@ __wb_inode_create (xlator_t *this, inode_t *inode) { wb_inode_t *wb_inode = NULL; wb_conf_t *conf = NULL; + int ret = 0; GF_VALIDATE_OR_GOTO (this->name, inode, out); @@ -613,7 +614,11 @@ __wb_inode_create (xlator_t *this, inode_t *inode) LOCK_INIT (&wb_inode->lock); - __inode_ctx_put (inode, this, (uint64_t)(unsigned long)wb_inode); + ret = __inode_ctx_put (inode, this, (uint64_t)(unsigned long)wb_inode); + if (ret) { + GF_FREE (wb_inode); + wb_inode = NULL; + } out: return wb_inode; diff --git a/xlators/system/posix-acl/src/posix-acl.c b/xlators/system/posix-acl/src/posix-acl.c index 3f4d40af48e..ed117b809cb 100644 --- a/xlators/system/posix-acl/src/posix-acl.c +++ b/xlators/system/posix-acl/src/posix-acl.c @@ -310,6 +310,10 @@ __posix_acl_ctx_get (inode_t *inode, xlator_t *this, gf_boolean_t create) return NULL; ret = __inode_ctx_put (inode, this, UINT64 (ctx)); + if (ret) { + GF_FREE (ctx); + ctx = NULL; + } return ctx; } |