From 0c441f940e648309fc63fdddfbd639d5273d3094 Mon Sep 17 00:00:00 2001 From: chenjinhao Date: Fri, 28 Nov 2025 11:07:08 +0800 Subject: [PATCH 1/3] glusterd: fix memleak in args->errstr args->errstr is generated by gf_strdup, so it should be manually freed at the end of its life cycle. Fixes: #4637 Signed-off-by: chenjinhao --- xlators/mgmt/glusterd/src/glusterd-syncop.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xlators/mgmt/glusterd/src/glusterd-syncop.c b/xlators/mgmt/glusterd/src/glusterd-syncop.c index aaee109cc36..75894029754 100644 --- a/xlators/mgmt/glusterd/src/glusterd-syncop.c +++ b/xlators/mgmt/glusterd/src/glusterd-syncop.c @@ -130,6 +130,10 @@ gd_syncargs_fini(struct syncargs *args) pthread_mutex_destroy(&args->lock_dict); syncbarrier_destroy(&args->barrier); } + if (args->errstr) { + GF_FREE(args->errstr); + args->errstr = NULL; + } } static void From d8a01194893e6325f31898a0a3a8fc2421b0f684 Mon Sep 17 00:00:00 2001 From: chenjinhao Date: Fri, 28 Nov 2025 11:18:32 +0800 Subject: [PATCH 2/3] glusterd: fix possible mutex and syncbarrier leak Add missing gd_syncargs_fini() calls in functions to avoid mutex and syncbarrier leaks. original patch: 6279c5b967 Updates: #1000 Signed-off-by: chenjinhao --- xlators/mgmt/glusterd/src/glusterd-handler.c | 3 +-- xlators/mgmt/glusterd/src/glusterd-syncop.c | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 979691d06a8..b1eeec646ab 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -5513,8 +5513,7 @@ glusterd_print_client_details(FILE *fp, dict_t *dict, } if (args.dict) dict_unref(args.dict); - if (args.errstr) - GF_FREE(args.errstr); + gd_syncargs_fini(&args); return ret; } diff --git a/xlators/mgmt/glusterd/src/glusterd-syncop.c b/xlators/mgmt/glusterd/src/glusterd-syncop.c index 75894029754..2dbb6eb265c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-syncop.c +++ b/xlators/mgmt/glusterd/src/glusterd-syncop.c @@ -1595,8 +1595,10 @@ gd_syncop_mgmt_brick_op(struct rpc_clnt *rpc, glusterd_pending_node_t *pnode, if (args.errstr) { if ((strlen(args.errstr) > 0) && errstr) *errstr = args.errstr; - else + else { GF_FREE(args.errstr); + args.errstr = NULL; + } } if (GD_OP_STATUS_VOLUME == op) { @@ -1646,6 +1648,7 @@ gd_syncop_mgmt_brick_op(struct rpc_clnt *rpc, glusterd_pending_node_t *pnode, } } gd_brick_op_req_free(req); + gd_syncargs_fini(&args); return args.op_ret; } @@ -1873,6 +1876,7 @@ gd_lock_op_phase(glusterd_conf_t *conf, glusterd_op_t op, dict_t *op_ctx, "to %d peers. Returning %d", gd_op_list[op], peer_cnt, ret); out: + gd_syncargs_fini(&args); return ret; } From 8831eb54e0425aedb396c2113cafbe21db74cf32 Mon Sep 17 00:00:00 2001 From: chenjinhao Date: Fri, 28 Nov 2025 11:44:06 +0800 Subject: [PATCH 3/3] ec: fix compilation error on case-label declaration Fix following compilation error ec-inode-read.c: In function 'ec_manager_readv': ec-inode-read.c:1375:13: error: a label can only be part of a statement and a declaration is not a statement uintptr_t inode_read_mask = ec_inode_readmask_get(fop->fd->inode, ^~~~~~~~~ make[5]: *** [Makefile:650: ec-inode-read.lo] Error 1 Fixes: #4637 Signed-off-by: chenjinhao --- xlators/cluster/ec/src/ec-inode-read.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c index 94ffd878798..d1b890f3643 100644 --- a/xlators/cluster/ec/src/ec-inode-read.c +++ b/xlators/cluster/ec/src/ec-inode-read.c @@ -1353,6 +1353,7 @@ ec_manager_readv(ec_fop_data_t *fop, int32_t state) { ec_cbk_data_t *cbk; ec_t *ec = fop->xl->private; + uintptr_t inode_read_mask; switch (state) { case EC_STATE_INIT: @@ -1372,8 +1373,8 @@ ec_manager_readv(ec_fop_data_t *fop, int32_t state) return EC_STATE_DISPATCH; case EC_STATE_DISPATCH: - uintptr_t inode_read_mask = ec_inode_readmask_get(fop->fd->inode, - fop->xl); + inode_read_mask = ec_inode_readmask_get(fop->fd->inode, + fop->xl); if (inode_read_mask != 0) { fop->mask &= inode_read_mask; } else if (ec->read_mask) {