Projects
home:Eustace:branches:Eulaceura:Factory
glusterfs
_service:obs_scm:0005-glusterd-fix-memory-leaks...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:0005-glusterd-fix-memory-leaks-due-to-lack-of-GF_FREE.patch of Package glusterfs
From a910f59d534e19bd6fca5aa0e47b40afbbfc7f56 Mon Sep 17 00:00:00 2001 From: chenjinhao <chen.jinhao@zte.com.cn> Date: Mon, 22 Jul 2024 11:10:28 +0800 Subject: [PATCH] glusterd: fix memory leaks due to lack of GF_FREE In glusterd-store.c, there are while loops like: gf_store_iter_get_next(iter, &key, &value, &op_errno); while (!ret) { if (xx_condition) { do_something(); goto out; } GF_FREE(key); GF_FREE(value); key = NULL; value = NULL; ret = gf_store_iter_get_next(iter, &key, &value, &op_errno); } It's ok under normal case, howerver, once the condition does not meet and the procedure goto 'out', there will be memory leak. Hence, it is necessary to put a check at 'out'. Similar leaks will be triggered in glusterd_store_retrieve_peers. If no peerinfo is found, the procedure will goto the next loop. It means memory previously allocated for key & value will be leaked once gf_store_iter_get_next is called again in the next loop. Signed-off-by: chenjinhao <chen.jinhao@zte.com.cn> --- xlators/mgmt/glusterd/src/glusterd-store.c | 16 ++++++++++++++++ xlators/storage/posix/src/posix-helpers.c | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 42d82d8..8594fc9 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -2364,6 +2364,10 @@ glusterd_store_retrieve_snapd(glusterd_volinfo_t *volinfo) SLEN(GLUSTERD_STORE_KEY_SNAPD_PORT))) { volinfo->snapd.port = atoi(value); } + GF_FREE(key); + GF_FREE(value); + key = NULL; + value = NULL; ret = gf_store_iter_get_next(iter, &key, &value, &op_errno); } @@ -2896,6 +2900,10 @@ glusterd_store_retrieve_bricks(glusterd_volinfo_t *volinfo) ret = 0; out: + if (key) + GF_FREE(key); + if (value) + GF_FREE(value); if (gf_store_iter_destroy(&tmpiter)) { gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_STORE_ITER_DESTROY_FAIL, "Failed to destroy store iter"); @@ -3041,6 +3049,10 @@ out: if (dup_value) GF_FREE(dup_value); + if (key) + GF_FREE(key); + if (value) + GF_FREE(value); if (ret) { if (volinfo->rebal.dict) dict_unref(volinfo->rebal.dict); @@ -4633,6 +4645,10 @@ glusterd_store_retrieve_peers(xlator_t *this) peerinfo = glusterd_peerinfo_new(GD_FRIEND_STATE_DEFAULT, NULL, NULL, 0); if (peerinfo == NULL) { + GF_FREE(key); + GF_FREE(value); + key = NULL; + value = NULL; ret = -1; goto next; } diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 08bb4ac..9fae102 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -3288,6 +3288,8 @@ posix_cs_set_state(xlator_t *this, dict_t **rsp, gf_cs_obj_state state, xattrsize = sys_fgetxattr(*fd, GF_CS_OBJECT_REMOTE, value, xattrsize + 1); if (xattrsize == -1) { + if (value) + GF_FREE(value); gf_msg(this->name, GF_LOG_ERROR, 0, errno, " getxattr failed for key %s", GF_CS_OBJECT_REMOTE); goto out; @@ -3311,6 +3313,8 @@ posix_cs_set_state(xlator_t *this, dict_t **rsp, gf_cs_obj_state state, xattrsize = sys_lgetxattr(path, GF_CS_OBJECT_REMOTE, value, xattrsize + 1); if (xattrsize == -1) { + if (value) + GF_FREE(value); gf_msg(this->name, GF_LOG_ERROR, 0, errno, " getxattr failed for key %s", GF_CS_OBJECT_REMOTE); goto out; -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2