fix:[TD-31351] avoid double free.

This commit is contained in:
sima 2024-08-09 18:16:39 +08:00
parent 9796c9dfa4
commit c9b9871477
1 changed files with 14 additions and 8 deletions

View File

@ -1066,7 +1066,8 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void **data, int32_t type,
info->fields[type].fields =
taosMemoryRealloc(info->fields[type].fields, info->fields[type].size * sizeof(SFilterField));
if (info->fields[type].fields == NULL) {
return TSDB_CODE_OUT_OF_MEMORY;
fltError("taosMemoryRealloc failed, size:%d", (int32_t)(info->fields[type].size * sizeof(SFilterField)));
FLT_ERR_RET(terrno);
}
}
@ -1086,14 +1087,20 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void **data, int32_t type,
taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, false);
if (NULL == info->pctx.valHash) {
fltError("taosHashInit failed, size:%d", FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_VALUE_SIZE);
FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
if (srcFlag) {
FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
}
FLT_ERR_RET(terrno);
}
}
SFilterDataInfo dInfo = {idx, *data};
if (taosHashPut(info->pctx.valHash, *data, dataLen, &dInfo, sizeof(dInfo))) {
fltError("taosHashPut to set failed");
FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
if (srcFlag) {
FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
}
FLT_ERR_RET(terrno);
}
if (srcFlag) {
FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
@ -1102,7 +1109,7 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void **data, int32_t type,
} else if (type != FLD_TYPE_COLUMN && data) {
if (freeIfExists) {
taosMemoryFreeClear(*data);
} else if (sameBuf) {
} else if (sameBuf && srcFlag) {
FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
}
}
@ -1114,11 +1121,11 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void **data, int32_t type,
}
static FORCE_INLINE int32_t filterAddColFieldFromField(SFilterInfo *info, SFilterField *field, SFilterFieldId *fid) {
FLT_ERR_RET(filterAddField(info, field->desc, &field->data, FILTER_GET_TYPE(field->flag), fid, 0, false, NULL));
int32_t code = filterAddField(info, field->desc, &field->data, FILTER_GET_TYPE(field->flag), fid, 0, false, NULL);
FILTER_SET_FLAG(field->flag, FLD_DATA_NO_FREE);
return TSDB_CODE_SUCCESS;
return code;
}
int32_t filterAddFieldFromNode(SFilterInfo *info, SNode *node, SFilterFieldId *fid) {
@ -2855,10 +2862,9 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t gResNum
}
}
}
FLT_ERR_JRET(filterConvertGroupFromArray(info, group));
_return:
FLT_ERR_RET(filterConvertGroupFromArray(info, group));
taosArrayDestroy(group);
filterFreeInfo(&oinfo);