From 5d750f26aad31d561e27713cb52e7fd140db95ad Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Thu, 31 Mar 2022 19:16:56 +0800 Subject: [PATCH] [TD-13756]: file close memory error. --- include/os/osMemory.h | 1 + source/os/src/osFile.c | 2 +- source/os/src/osMemory.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/include/os/osMemory.h b/include/os/osMemory.h index 62ac82782c..34e2422167 100644 --- a/include/os/osMemory.h +++ b/include/os/osMemory.h @@ -32,6 +32,7 @@ extern "C" { void *taosMemoryMalloc(int32_t size); void *taosMemoryCalloc(int32_t num, int32_t size); void *taosMemoryRealloc(void *ptr, int32_t size); +void *taosMemoryStrDup(void *ptr); void taosMemoryFree(const void *ptr); int32_t taosMemorySize(void *ptr); diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index ed93708c07..1b73f96896 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -294,7 +294,7 @@ int64_t taosCloseFile(TdFilePtr *ppFile) { #if FILE_WITH_LOCK taosThreadRwlockWrlock(&((*ppFile)->rwlock)); #endif - if (ppFile == NULL || *ppFile == NULL || (*ppFile)->fd == -1) { + if (ppFile == NULL || *ppFile == NULL) { return 0; } if ((*ppFile)->fp != NULL) { diff --git a/source/os/src/osMemory.c b/source/os/src/osMemory.c index f4d4c74d1d..3545aabdca 100644 --- a/source/os/src/osMemory.c +++ b/source/os/src/osMemory.c @@ -23,15 +23,22 @@ #define TD_MEMORY_STACK_TRACE_DEPTH 10 +typedef struct TdMemoryInfo *TdMemoryInfoPtr; + typedef struct TdMemoryInfo { int32_t symbol; int32_t memorySize; void *stackTrace[TD_MEMORY_STACK_TRACE_DEPTH]; // gdb: disassemble /m 0xXXX -} *TdMemoryInfoPtr , TdMemoryInfo; + // TdMemoryInfoPtr pNext; + // TdMemoryInfoPtr pPrev; +} TdMemoryInfo; + +// static TdMemoryInfoPtr GlobalMemoryPtr = NULL; #if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) - + #define tstrdup(str) _strdup(str) #else + #define tstrdup(str) strdup(str) #include @@ -129,6 +136,26 @@ void *taosMemoryRealloc(void *ptr, int32_t size) { #endif } +void *taosMemoryStrDup(void *ptr) { +#ifdef USE_TD_MEMORY + if (ptr == NULL) return NULL; + + TdMemoryInfoPtr pTdMemoryInfo = (TdMemoryInfoPtr)((char*)ptr - sizeof(TdMemoryInfo)); + assert(pTdMemoryInfo->symbol == TD_MEMORY_SYMBOL); + + void *tmp = tstrdup((const char *)pTdMemoryInfo); + if (tmp == NULL) return NULL; + + memcpy(tmp, pTdMemoryInfo, sizeof(TdMemoryInfo)); + taosBackTrace(((TdMemoryInfoPtr)tmp)->stackTrace,TD_MEMORY_STACK_TRACE_DEPTH); + + return (char*)tmp + sizeof(TdMemoryInfo); +#else + return tstrdup((const char *)ptr); +#endif +} + + void taosMemoryFree(const void *ptr) { if (ptr == NULL) return;