From 739acf425a3e380ef9e1229d63763d7d62b1d85a Mon Sep 17 00:00:00 2001 From: laiyongtao Date: Thu, 25 Apr 2024 20:58:50 +0800 Subject: [PATCH 1/2] set parent environ to udfd --- source/libs/function/src/tudf.c | 42 +++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c index 7e344866a5..7c0e66d072 100644 --- a/source/libs/function/src/tudf.c +++ b/source/libs/function/src/tudf.c @@ -49,6 +49,8 @@ SUdfdData udfdGlobal = {0}; int32_t udfStartUdfd(int32_t startDnodeId); int32_t udfStopUdfd(); +extern char **environ; + static int32_t udfSpawnUdfd(SUdfdData *pData); void udfUdfdExit(uv_process_t *process, int64_t exitStatus, int termSignal); static int32_t udfSpawnUdfd(SUdfdData *pData); @@ -147,7 +149,33 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) { snprintf(ldLibPathEnvItem, 1024 + 32, "%s=%s", "LD_LIBRARY_PATH", udfdPathLdLib); char *envUdfd[] = {dnodeIdEnvItem, thrdPoolSizeEnvItem, ldLibPathEnvItem, NULL}; - options.env = envUdfd; + char **envUdfdWithPEnv = NULL; + if (environ != NULL) { + int numEnviron = 0; + while (environ[numEnviron] != NULL) { + numEnviron++; + } + int lenEnvUdfd = ARRAY_SIZE(envUdfd); + + envUdfdWithPEnv = (char**) taosMemoryMalloc((numEnviron + lenEnvUdfd) * sizeof(char*)); + + int i; + for (i = 0; i < numEnviron; i++) { + envUdfdWithPEnv[i] = (char*) taosMemoryMalloc(strlen(environ[i]) + 1); + strcpy(envUdfdWithPEnv[i], environ[i]); + } + for (i = 0; i < lenEnvUdfd; i++) { + if (envUdfd[i] != NULL) { + envUdfdWithPEnv[numEnviron + i] = (char*) taosMemoryMalloc(strlen(envUdfd[i]) + 1); + strcpy(envUdfdWithPEnv[numEnviron + i], envUdfd[i]); + } + } + envUdfdWithPEnv[numEnviron + lenEnvUdfd - 1] = NULL; + + options.env = envUdfdWithPEnv; + } else { + options.env = envUdfd; + } int err = uv_spawn(&pData->loop, &pData->process, &options); pData->process.data = (void *)pData; @@ -176,6 +204,16 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) { } else { fnInfo("udfd is initialized"); } + + if (envUdfdWithPEnv != NULL) { + int i = 0; + while (envUdfdWithPEnv[i] != NULL) { + taosMemoryFree(envUdfdWithPEnv[i]); + i++; + } + taosMemoryFree(envUdfdWithPEnv); + } + return err; } @@ -1941,7 +1979,7 @@ int32_t doCallUdfScalarFunc(UdfcFuncHandle handle, SScalarParam *input, int32_t convertDataBlockToScalarParm(&resultBlock, output); taosArrayDestroy(resultBlock.pDataBlock); } - + blockDataFreeRes(&inputBlock); return err; } From 031146b3b5316ba203b8802c20212b64e7219163 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 4 Nov 2024 11:53:24 +0800 Subject: [PATCH 2/2] fix: check memory calloc --- source/libs/function/src/tudf.c | 34 ++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c index b19320d27f..a8198a804d 100644 --- a/source/libs/function/src/tudf.c +++ b/source/libs/function/src/tudf.c @@ -77,6 +77,8 @@ void udfUdfdExit(uv_process_t *process, int64_t exitStatus, int32_t termSignal) static int32_t udfSpawnUdfd(SUdfdData *pData) { fnInfo("start to init udfd"); + + int32_t err = 0; uv_process_options_t options = {0}; char path[PATH_MAX] = {0}; @@ -177,22 +179,39 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) { char **envUdfdWithPEnv = NULL; if (environ != NULL) { + int32_t lenEnvUdfd = ARRAY_SIZE(envUdfd); int32_t numEnviron = 0; while (environ[numEnviron] != NULL) { numEnviron++; } - int32_t lenEnvUdfd = ARRAY_SIZE(envUdfd); - envUdfdWithPEnv = (char **)taosMemoryMalloc((numEnviron + lenEnvUdfd) * sizeof(char *)); + envUdfdWithPEnv = (char **)taosMemoryCalloc(numEnviron + lenEnvUdfd, sizeof(char *)); + if (envUdfdWithPEnv == NULL) { + err = TSDB_CODE_OUT_OF_MEMORY; + goto _OVER; + } for (int32_t i = 0; i < numEnviron; i++) { - envUdfdWithPEnv[i] = (char *)taosMemoryMalloc(strlen(environ[i]) + 1); - strcpy(envUdfdWithPEnv[i], environ[i]); + int32_t len = strlen(environ[i]) + 1; + envUdfdWithPEnv[i] = (char *)taosMemoryCalloc(len, 1); + if (envUdfdWithPEnv[i] == NULL) { + err = TSDB_CODE_OUT_OF_MEMORY; + goto _OVER; + } + + tstrncpy(envUdfdWithPEnv[i], environ[i], len); } + for (int32_t i = 0; i < lenEnvUdfd; i++) { if (envUdfd[i] != NULL) { - envUdfdWithPEnv[numEnviron + i] = (char *)taosMemoryMalloc(strlen(envUdfd[i]) + 1); - strcpy(envUdfdWithPEnv[numEnviron + i], envUdfd[i]); + int32_t len = strlen(envUdfd[i]) + 1; + envUdfdWithPEnv[numEnviron + i] = (char *)taosMemoryCalloc(len, 1); + if (envUdfdWithPEnv[numEnviron + i] == NULL) { + err = TSDB_CODE_OUT_OF_MEMORY; + goto _OVER; + } + + tstrncpy(envUdfdWithPEnv[numEnviron + i], envUdfd[i], len); } } envUdfdWithPEnv[numEnviron + lenEnvUdfd - 1] = NULL; @@ -202,7 +221,7 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) { options.env = envUdfd; } - int32_t err = uv_spawn(&pData->loop, &pData->process, &options); + err = uv_spawn(&pData->loop, &pData->process, &options); pData->process.data = (void *)pData; #ifdef WINDOWS @@ -230,6 +249,7 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) { fnInfo("udfd is initialized"); } +_OVER: if (taosFqdnEnvItem) { taosMemoryFree(taosFqdnEnvItem); }