From 784fda81910a5d4bcde4280e49e55c4fabeed861 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 20 Jun 2024 13:51:40 +0800 Subject: [PATCH] fix: cast long binary crash issue --- source/libs/scalar/src/sclfunc.c | 10 ++++++---- tests/script/tsim/scalar/scalar.sim | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c index da26d7e3b9..48bedde91a 100644 --- a/source/libs/scalar/src/sclfunc.c +++ b/source/libs/scalar/src/sclfunc.c @@ -737,9 +737,10 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp int32_t code = TSDB_CODE_SUCCESS; char *convBuf = taosMemoryMalloc(inputLen); char *output = taosMemoryCalloc(1, outputLen + TSDB_NCHAR_SIZE); - char buf[400] = {0}; + int32_t bufSize = TSDB_MAX_FIELD_LEN + 1; + char *buf = taosMemoryMalloc(bufSize); - if (convBuf == NULL || output == NULL) { + if (convBuf == NULL || output == NULL || buf == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _end; } @@ -991,7 +992,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp memcpy(varDataVal(output), convBuf, len); varDataSetLen(output, len); } else { - NUM_TO_STRING(inputType, input, sizeof(buf), buf); + NUM_TO_STRING(inputType, input, bufSize, buf); int32_t len = (int32_t)strlen(buf); len = (outputLen - VARSTR_HEADER_SIZE) > len ? len : (outputLen - VARSTR_HEADER_SIZE); memcpy(varDataVal(output), buf, len); @@ -1037,7 +1038,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp memcpy(output, input, len + VARSTR_HEADER_SIZE); varDataSetLen(output, len); } else { - NUM_TO_STRING(inputType, input, sizeof(buf), buf); + NUM_TO_STRING(inputType, input, bufSize, buf); len = (int32_t)strlen(buf); len = outputCharLen > len ? len : outputCharLen; bool ret = taosMbsToUcs4(buf, len, (TdUcs4 *)varDataVal(output), outputLen - VARSTR_HEADER_SIZE, &len); @@ -1067,6 +1068,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp pOutput->numOfRows = pInput->numOfRows; _end: + taosMemoryFree(buf); taosMemoryFree(output); taosMemoryFree(convBuf); return code; diff --git a/tests/script/tsim/scalar/scalar.sim b/tests/script/tsim/scalar/scalar.sim index 900f7c0904..e28c3d1a4d 100644 --- a/tests/script/tsim/scalar/scalar.sim +++ b/tests/script/tsim/scalar/scalar.sim @@ -48,6 +48,8 @@ if $data00 != @70-02-01 08:00:00.001@ then return -1 endi +sql select cast('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as double); + sql select 1-1n; if $rows != 1 then return -1