From 98a2d311b7fcf5068046f04d0df27eee38dba1bd Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Sat, 14 May 2022 22:15:55 +0800 Subject: [PATCH] refactor:fix memory leak --- source/client/src/clientSml.c | 14 ++++++++++---- source/client/test/smlTest.cpp | 15 +++++++++++---- source/libs/parser/src/parInsert.c | 3 +++ source/libs/parser/src/parInsertData.c | 6 +++--- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 2a3c7f9cdd..8ed4308ea7 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -885,7 +885,7 @@ static int32_t smlParseInfluxString(const char* sql, SSmlLineInfo *elements, SSm // parse measure while (*sql != '\0') { - if(IS_SLASH_LETTER(sql)){ + if((sql != elements->measure) && IS_SLASH_LETTER(sql)){ MOVE_FORWARD_ONE(sql,strlen(sql) + 1); continue; } @@ -973,6 +973,8 @@ static int32_t smlParseTelnetTags(const char* data, SArray *cols, SHashObj *dump const char *sql = data; while(*sql != '\0'){ JUMP_SPACE(sql) + if(*sql == '\0') break; + const char *key = sql; int32_t keyLen = 0; @@ -1005,6 +1007,8 @@ static int32_t smlParseTelnetTags(const char* data, SArray *cols, SHashObj *dump while(*sql != '\0') { // parse value if (*sql == SPACE) { + valueLen = sql - value; + sql++; break; } if (*sql == EQUAL) { @@ -1013,14 +1017,15 @@ static int32_t smlParseTelnetTags(const char* data, SArray *cols, SHashObj *dump } sql++; } - valueLen = sql - value; - sql++; - JUMP_SPACE(sql) + if(valueLen == 0){ + valueLen = sql - value; + } if(valueLen == 0){ smlBuildInvalidDataMsg(msg, "invalid value", value); return TSDB_CODE_SML_INVALID_DATA; } + // add kv to SSmlKv SSmlKv *kv = (SSmlKv *)taosMemoryCalloc(sizeof(SSmlKv), 1); if(!kv) return TSDB_CODE_OUT_OF_MEMORY; @@ -1354,6 +1359,7 @@ static void smlDestroySTableMeta(SSmlSTableMeta *meta){ taosArrayDestroy(meta->tags); taosArrayDestroy(meta->cols); taosMemoryFree(meta->tableMeta); + taosMemoryFree(meta); } static void smlDestroyCols(SArray *cols) { diff --git a/source/client/test/smlTest.cpp b/source/client/test/smlTest.cpp index dabf2c0209..589c3d3a10 100644 --- a/source/client/test/smlTest.cpp +++ b/source/client/test/smlTest.cpp @@ -206,10 +206,16 @@ TEST(testCase, smlParseCols_Error_Test) { int32_t len = strlen(data[i]); char *sql = (char*)taosMemoryCalloc(256, 1); memcpy(sql, data[i], len + 1); - int32_t ret = smlParseCols(sql, len, NULL, false, dumplicateKey, &msgBuf); + SArray *cols = taosArrayInit(8, POINTER_BYTES); + int32_t ret = smlParseCols(sql, len, cols, false, dumplicateKey, &msgBuf); ASSERT_NE(ret, TSDB_CODE_SUCCESS); taosHashClear(dumplicateKey); taosMemoryFree(sql); + for(int j = 0; j < taosArrayGetSize(cols); j++){ + void *kv = taosArrayGetP(cols, j); + taosMemoryFree(kv); + } + taosArrayDestroy(cols); } taosHashCleanup(dumplicateKey); } @@ -239,7 +245,6 @@ TEST(testCase, smlParseCols_tag_Test) { ASSERT_EQ(kv->type, TSDB_DATA_TYPE_NCHAR); ASSERT_EQ(kv->length, 15); ASSERT_EQ(strncasecmp(kv->value, "\"passit", 7), 0); - taosMemoryFree(kv); // nchar kv = (SSmlKv *)taosArrayGetP(cols, 3); @@ -248,11 +253,13 @@ TEST(testCase, smlParseCols_tag_Test) { ASSERT_EQ(kv->type, TSDB_DATA_TYPE_NCHAR); ASSERT_EQ(kv->length, 7); ASSERT_EQ(strncasecmp(kv->value, "4.31f64", 7), 0); - taosMemoryFree(kv); + for(int i = 0; i < size; i++){ + void *tmp = taosArrayGetP(cols, i); + taosMemoryFree(tmp); + } taosArrayClear(cols); - // test tag is null data = "t=3e"; len = 0; diff --git a/source/libs/parser/src/parInsert.c b/source/libs/parser/src/parInsert.c index 27383c0a51..15e4b8ef36 100644 --- a/source/libs/parser/src/parInsert.c +++ b/source/libs/parser/src/parInsert.c @@ -1826,6 +1826,9 @@ void smlDestroyHandle(void* pHandle) { if (!pHandle) return; SSmlExecHandle* handle = (SSmlExecHandle*)pHandle; destroyBlockHashmap(handle->pBlockHash); + tdDestroyKVRowBuilder(&handle->tagsBuilder); + destroyBoundColumnInfo(&handle->tags); + destroyCreateSubTbReq(&handle->createTblReq); taosMemoryFree(handle); } diff --git a/source/libs/parser/src/parInsertData.c b/source/libs/parser/src/parInsertData.c index 677dbca0e9..8b649350b7 100644 --- a/source/libs/parser/src/parInsertData.c +++ b/source/libs/parser/src/parInsertData.c @@ -237,9 +237,9 @@ static void destroyDataBlock(STableDataBlocks* pDataBlock) { taosMemoryFreeClear(pDataBlock->pData); if (!pDataBlock->cloned) { // free the refcount for metermeta -// if (pDataBlock->pTableMeta != NULL) { -// taosMemoryFreeClear(pDataBlock->pTableMeta); -// } + if (pDataBlock->pTableMeta != NULL) { + taosMemoryFreeClear(pDataBlock->pTableMeta); + } destroyBoundColumnInfo(&pDataBlock->boundColumnInfo); }