From c3149f52252e2b4a30e599f9766484e8d608da3f Mon Sep 17 00:00:00 2001 From: Jing Sima Date: Thu, 5 Sep 2024 18:18:51 +0800 Subject: [PATCH] fix:[TD-31914] Fix mem leak when error occurs. --- source/libs/scalar/src/filter.c | 49 +++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 382b83012d..9a9b5b44f1 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -1274,6 +1274,16 @@ int32_t filterAddUnitToGroup(SFilterGroup *group, uint32_t unitIdx) { return TSDB_CODE_SUCCESS; } +static void filterFreeGroup(void *pItem) { + if (pItem == NULL) { + return; + } + + SFilterGroup *p = (SFilterGroup *)pItem; + taosMemoryFreeClear(p->unitIdxs); + taosMemoryFreeClear(p->unitFlags); +} + int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) { SOperatorNode *node = (SOperatorNode *)tree; int32_t ret = TSDB_CODE_SUCCESS; @@ -1336,9 +1346,11 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) { SFilterGroup fgroup = {0}; code = filterAddUnitToGroup(&fgroup, uidx); if (TSDB_CODE_SUCCESS != code) { + filterFreeGroup((void*)&fgroup); break; } if (NULL == taosArrayPush(group, &fgroup)) { + filterFreeGroup((void*)&fgroup); code = TSDB_CODE_OUT_OF_MEMORY; break; } @@ -1658,16 +1670,6 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan return TSDB_CODE_SUCCESS; } -static void filterFreeGroup(void *pItem) { - if (pItem == NULL) { - return; - } - - SFilterGroup *p = (SFilterGroup *)pItem; - taosMemoryFreeClear(p->unitIdxs); - taosMemoryFreeClear(p->unitFlags); -} - EDealRes fltTreeToGroup(SNode *pNode, void *pContext) { int32_t code = TSDB_CODE_SUCCESS; SArray *preGroup = NULL; @@ -2944,25 +2946,44 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t gResNum for (int32_t n = 0; n < usize; ++n) { SFilterUnit *u = (SFilterUnit *)taosArrayGetP((SArray *)colInfo->info, n); if (NULL == u) { - FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE); + code = TSDB_CODE_OUT_OF_RANGE; + break; } - FLT_ERR_JRET(filterAddUnitFromUnit(info, &oinfo, u, &uidx)); - FLT_ERR_JRET(filterAddUnitToGroup(&ng, uidx)); + code = filterAddUnitFromUnit(info, &oinfo, u, &uidx); + if (TSDB_CODE_SUCCESS != code) { + break; + } + code = filterAddUnitToGroup(&ng, uidx); + if (TSDB_CODE_SUCCESS != code) { + break; + } + } + if (TSDB_CODE_SUCCESS != code) { + break; } continue; } + if (TSDB_CODE_SUCCESS != code) { + filterFreeGroup((void*)&ng); + FLT_ERR_JRET(code); + } if (colInfo->type != RANGE_TYPE_MR_CTX) { fltError("filterRewrite get invalid col type : %d", colInfo->type); FLT_ERR_JRET(TSDB_CODE_QRY_FILTER_INVALID_TYPE); } - FLT_ERR_JRET(filterAddGroupUnitFromCtx(info, &oinfo, colInfo->info, res->colIdx[m], &ng, optr, group)); + code = filterAddGroupUnitFromCtx(info, &oinfo, colInfo->info, res->colIdx[m], &ng, optr, group); + if (TSDB_CODE_SUCCESS != code) { + filterFreeGroup((void*)&ng); + FLT_ERR_JRET(code); + } } if (ng.unitNum > 0) { if (NULL == taosArrayPush(group, &ng)) { + filterFreeGroup((void*)&ng); FLT_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); } }