From e6649b78dae7ec7d4b9dbebd3b2413fc06d40405 Mon Sep 17 00:00:00 2001 From: Jing Sima Date: Mon, 26 Aug 2024 17:18:35 +0800 Subject: [PATCH] fix:[TD-31703] fix memory leak when error occurs in filterMergeGroupUnits. --- source/libs/scalar/inc/filterInt.h | 4 ++-- source/libs/scalar/src/filter.c | 15 +++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/source/libs/scalar/inc/filterInt.h b/source/libs/scalar/inc/filterInt.h index 4d45fb344c..9adc9ee99c 100644 --- a/source/libs/scalar/inc/filterInt.h +++ b/source/libs/scalar/inc/filterInt.h @@ -464,7 +464,7 @@ struct SFilterInfo { (colInfo).type = RANGE_TYPE_UNIT; \ (colInfo).dataType = FILTER_UNIT_DATA_TYPE(u); \ if (taosArrayPush((SArray *)((colInfo).info), &u) == NULL) { \ - FLT_ERR_RET(terrno); \ + FLT_ERR_JRET(terrno); \ } \ } while (0) #define FILTER_PUSH_VAR_HASH(colInfo, ha) \ @@ -482,7 +482,7 @@ struct SFilterInfo { do { \ *(dst) = taosMemoryMalloc(sizeof(uint32_t) * n); \ if (NULL == *(dst)) { \ - FLT_ERR_JRET(terrno); \ + FLT_ERR_JRET(terrno); \ } \ (void)memcpy(*(dst), src, sizeof(uint32_t) * n); \ } while (0) diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index c50e807675..cbc7ca77bb 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -2446,8 +2446,7 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t } gRes[gResIdx]->colInfo = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].num, sizeof(SFilterColInfo)); if (gRes[gResIdx]->colInfo == NULL) { - filterFreeGroupCtx(gRes[gResIdx]); - FLT_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); + FLT_ERR_JRET(terrno); } colIdxi = 0; empty = false; @@ -2459,7 +2458,6 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t if (gRes[gResIdx]->colInfo[cidx].info == NULL) { gRes[gResIdx]->colInfo[cidx].info = (SArray *)taosArrayInit(4, POINTER_BYTES); if (gRes[gResIdx]->colInfo[cidx].info == NULL) { - filterFreeGroupCtx(gRes[gResIdx]); FLT_ERR_JRET(terrno); } colIdx[colIdxi++] = cidx; @@ -2476,7 +2474,6 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t if (colIdxi > 1) { __compar_fn_t cmpFn = getComparFunc(TSDB_DATA_TYPE_USMALLINT, 0); if (cmpFn == NULL) { - filterFreeGroupCtx(gRes[gResIdx]); FLT_ERR_JRET(terrno); } taosSort(colIdx, colIdxi, sizeof(uint32_t), cmpFn); @@ -2488,12 +2485,7 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t if (FILTER_NO_MERGE_DATA_TYPE(type)) { continue; } - - code = filterMergeUnits(info, gRes[gResIdx], colIdx[l], &empty); - if (TSDB_CODE_SUCCESS != code) { - filterFreeGroupCtx(gRes[gResIdx]); - SCL_ERR_JRET(code); - } + SCL_ERR_JRET(filterMergeUnits(info, gRes[gResIdx], colIdx[l], &empty)); if (empty) { break; @@ -2519,6 +2511,9 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t } _return: + if (code) { + filterFreeGroupCtx(gRes[gResIdx]); + } taosMemoryFreeClear(colIdx); FLT_RET(code); }