glusterfs/0006-glusterd-fix-memory-leaks-detected-by-asan.patch
cenhuilin 9827700256 glusterd: fix memory leak in glusterd
(cherry picked from commit 09a0a2ed5b8cb343206d27caa22e23901e6b6511)
2024-08-27 09:56:55 +08:00

113 lines
5.4 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From b9a37a2366bbfddd47da81bb86df97a9e6431d85 Mon Sep 17 00:00:00 2001
From: chenjinhao <chen.jinhao@zte.com.cn>
Date: Mon, 22 Jul 2024 11:15:58 +0800
Subject: [PATCH] glusterd: fix memory leaks detected by asan
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Memory leaks detected by setting --enable-asan, compile, install
and run gluster cmds, such as gluster v create/start/stop, etc.
Direct leak of 11430 byte(s) in 150 object(s) allocated from:
#0 0x7f59844efbb8 in __interceptor_malloc (/lib64/libasan.so.5+0xefbb8)
#1 0x7f5983aeb96d in __gf_malloc (/lib64/libglusterfs.so.0+0xeb96d)
#2 0x7f59775b569b in glusterd_store_update_volinfo ../../../../libglusterfs/src/glusterfs/mem-pool.h:170
#3 0x7f59775be3b5 in glusterd_store_retrieve_volume glusterd-store.c:3334
#4 0x7f59775bf076 in glusterd_store_retrieve_volumes glusterd-store.c:3571
#5 0x7f59775bfc9e in glusterd_restore glusterd-store.c:4913
#6 0x7f59774ca5a1 (/usr/lib64/glusterfs/8.2/xlator/mgmt/glusterd.so+0xca5a1)
#7 0x7f5983a7cb6b in __xlator_init xlator.c:594
#8 0x7f5983b0c5d0 in glusterfs_graph_init graph.c:422
#9 0x7f5983b0d422 in glusterfs_graph_activate (/lib64/libglusterfs.so.0+0x10d422)
#10 0x5605f2e1eff5 in glusterfs_process_volfp glusterfsd.c:2506
#11 0x5605f2e1f238 in glusterfs_volumes_init glusterfsd.c:2577
#12 0x5605f2e15d8d in main (/usr/sbin/glusterfsd+0x15d8d)
#13 0x7f598103acf2 in __libc_start_main (/lib64/libc.so.6+0x3acf2)
#14 0x5605f2e162cd in _start (/usr/sbin/glusterfsd+0x162cd)
In glusterd_store_update_volinfo, memory will be leaked when the dynamic memory is put
into a dict by calling dict_set_str:
ret = dict_set_str(volinfo->dict, key, gf_strdup(value));
Direct leak of 3351 byte(s) in 30 object(s) allocated from:
#0 0x7f59844efbb8 in __interceptor_malloc (/lib64/libasan.so.5+0xefbb8)
#1 0x7f5983aeb96d in __gf_malloc (/lib64/libglusterfs.so.0+0xeb96d)
#2 0x7f59775541e7 in glusterd_is_path_in_use ../../../../libglusterfs/src/glusterfs/mem-pool.h:170
#3 0x7f59775541e7 in glusterd_check_and_set_brick_xattr glusterd-utils.c:8203
#4 0x7f5977554d7c in glusterd_validate_and_create_brickpath glusterd-utils.c:1549
#5 0x7f5977645fcb in glusterd_op_stage_create_volume glusterd-volume-ops.c:1260
#6 0x7f5977519025 in glusterd_op_stage_validate glusterd-op-sm.c:5787
#7 0x7f5977672555 in gd_stage_op_phase glusterd-syncop.c:1297
#8 0x7f5977676db0 in gd_sync_task_begin glusterd-syncop.c:1951
#9 0x7f59776775dc in glusterd_op_begin_synctask glusterd-syncop.c:2016
#10 0x7f5977642bd6 in __glusterd_handle_create_volume glusterd-volume-ops.c:506
#11 0x7f59774e27b1 in glusterd_big_locked_handler glusterd-handler.c:83
#12 0x7f5983b14cac in synctask_wrap syncop.c:353
#13 0x7f59810240af (/lib64/libc.so.6+0x240af)
During volume creation, glusterd_is_path_in_use will be called to check brick path reuse.
Under normal circumstances, there is no problem however, when a `force` cmd is given during
volume creation and the futher sys_lsetxattr failed, the memory area previously pointed by
*op_errstr will be leakd, cause:
out:
if (strlen(msg))
*op_errstr = gf_strdup(msg);
Similar leak also exists in posix_cs_set_state:
value = GF_CALLOC(1, xattrsize + 1, gf_posix_mt_char);
...
dict_set_str_sizen(*rsp, GF_CS_OBJECT_REMOTE, value);
Signed-off-by: chenjinhao <chen.jinhao@zte.com.cn>
---
xlators/mgmt/glusterd/src/glusterd-store.c | 2 +-
xlators/mgmt/glusterd/src/glusterd-utils.c | 5 ++++-
xlators/storage/posix/src/posix-helpers.c | 2 +-
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
index 8594fc9..ce3d7a4 100644
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
@@ -3295,7 +3295,7 @@ glusterd_store_update_volinfo(glusterd_volinfo_t *volinfo)
*/
if (!strcmp(key, "features.limit-usage"))
break;
- ret = dict_set_str(volinfo->dict, key, gf_strdup(value));
+ ret = dict_set_dynstr(volinfo->dict, key, gf_strdup(value));
if (ret) {
gf_msg(this->name, GF_LOG_ERROR, 0,
GD_MSG_DICT_SET_FAILED,
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 72352ce..e255e99 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -7754,8 +7754,11 @@ glusterd_check_and_set_brick_xattr(char *host, char *path, uuid_t uuid,
ret = 0;
out:
- if (strlen(msg))
+ if (strlen(msg)) {
+ if (*op_errstr)
+ GF_FREE(*op_errstr);
*op_errstr = gf_strdup(msg);
+ }
return ret;
}
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index 9fae102..df3ed73 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -3329,7 +3329,7 @@ posix_cs_set_state(xlator_t *this, dict_t **rsp, gf_cs_obj_state state,
}
if (ret == 0) {
- ret = dict_set_str_sizen(*rsp, GF_CS_OBJECT_REMOTE, value);
+ ret = dict_set_dynstr_sizen(*rsp, GF_CS_OBJECT_REMOTE, value);
if (ret) {
gf_msg(this->name, GF_LOG_ERROR, 0, 0,
"failed to set"
--
2.33.0