From d4df4d1e5421651b3738439a288b84fd99d77158 Mon Sep 17 00:00:00 2001 From: huangjieliang Date: Tue, 3 Jan 2023 21:43:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:LMS=E6=A8=A1=E5=9D=97=E5=8F=8A=E5=A0=86?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=A8=A1=E5=9D=97=E9=9D=9E=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=AE=89=E5=85=A8=E5=90=88=E8=A7=84=E6=95=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close #I68LEO Signed-off-by: huangjieliang Change-Id: I38b859dcd1856f27d4577f5311c920d2d8b96385 --- components/backtrace/los_backtrace.c | 2 +- components/lms/los_lms.c | 40 ++++++++++++++-------------- components/lms/los_lms_pri.h | 3 ++- kernel/src/mm/los_memory.c | 38 +++++++++++++++++--------- 4 files changed, 49 insertions(+), 34 deletions(-) diff --git a/components/backtrace/los_backtrace.c b/components/backtrace/los_backtrace.c index 9c1ecfda..8c0eb4b5 100644 --- a/components/backtrace/los_backtrace.c +++ b/components/backtrace/los_backtrace.c @@ -43,7 +43,7 @@ judgment condition to support multiple code sections. */ WEAK BOOL OsStackDataIsCodeAddr(UINTPTR value) { - if ((value >= CODE_START_ADDR) && (value < CODE_END_ADDR)) { + if ((value > CODE_START_ADDR) && (value < CODE_END_ADDR)) { return TRUE; } return FALSE; diff --git a/components/lms/los_lms.c b/components/lms/los_lms.c index aef74d7a..2528c6b6 100644 --- a/components/lms/los_lms.c +++ b/components/lms/los_lms.c @@ -93,20 +93,25 @@ EXIT: STATIC LmsMemListNode *OsLmsGetPoolNodeFromAddr(UINTPTR addr) { LmsMemListNode *current = NULL; + LmsMemListNode *previous = NULL; LOS_DL_LIST *listHead = &g_lmsCheckPoolList; if (LOS_ListEmpty(&g_lmsCheckPoolList)) { - goto EXIT; + return NULL; } LOS_DL_LIST_FOR_EACH_ENTRY(current, listHead, LmsMemListNode, node) { - if ((addr >= current->poolAddr) && (addr < current->poolAddr + current->poolSize)) { - return current; + if ((addr < current->poolAddr) || (addr >= (current->poolAddr + current->poolSize))) { + continue; + } + if ((previous == NULL) || + ((previous->poolAddr <= current->poolAddr) && + ((current->poolAddr + current->poolSize) <= (previous->poolAddr + previous->poolSize)))) { + previous = current; } } -EXIT: - return NULL; + return previous; } STATIC LmsMemListNode *OsLmsCheckPoolCreate(VOID) @@ -136,18 +141,12 @@ UINT32 LOS_LmsCheckPoolAdd(const VOID *pool, UINT32 size) LMS_LOCK(intSave); - lmsPoolNode = OsLmsGetPoolNodeFromAddr((UINTPTR)pool); - if (lmsPoolNode != NULL) { /* if pool range already on checklist */ - if (lmsPoolNode->poolAddr != (UINTPTR)pool) { /* pool is a subset of lmsPoolNode->poolAddr */ - /* do not add it again, just return */ - PRINT_DEBUG("[LMS]pool %p already on lms checklist !\n", pool); - LMS_UNLOCK(intSave); - return size; /* return size indicate the shadow memory init successful */ - } else { /* Re-initialize the same pool, maybe with different size */ - /* delete the old node, then add a new one */ - lmsPoolNode->used = LMS_POOL_UNUSED; - LOS_ListDelete(&(lmsPoolNode->node)); - } + lmsPoolNode = OsLmsGetPoolNode(pool); + if (lmsPoolNode != NULL) { /* if pool already on checklist */ + /* Re-initialize the same pool, maybe with different size */ + /* delete the old node, then add a new one */ + lmsPoolNode->used = LMS_POOL_UNUSED; + LOS_ListDelete(&(lmsPoolNode->node)); } lmsPoolNode = OsLmsCheckPoolCreate(); @@ -163,7 +162,7 @@ UINT32 LOS_LmsCheckPoolAdd(const VOID *pool, UINT32 size) lmsPoolNode->shadowStart = (UINTPTR)poolAddr + realSize; lmsPoolNode->shadowSize = poolAddr + size - lmsPoolNode->shadowStart; /* init shadow value */ - (VOID)memset((VOID *)lmsPoolNode->shadowStart, LMS_SHADOW_AFTERFREE_U8, lmsPoolNode->shadowSize); + (VOID)memset_s((VOID *)lmsPoolNode->shadowStart, lmsPoolNode->shadowSize, LMS_SHADOW_AFTERFREE_U8, lmsPoolNode->shadowSize); LOS_ListAdd(&g_lmsCheckPoolList, &(lmsPoolNode->node)); @@ -193,10 +192,11 @@ RELEASE: VOID OsLmsInit(VOID) { - (VOID)memset(g_lmsCheckPoolArray, 0, sizeof(g_lmsCheckPoolArray)); + (VOID)memset_s(g_lmsCheckPoolArray, sizeof(g_lmsCheckPoolArray), 0, sizeof(g_lmsCheckPoolArray)); LOS_ListInit(&g_lmsCheckPoolList); static LmsHook hook = { .init = LOS_LmsCheckPoolAdd, + .deInit = LOS_LmsCheckPoolDel, .mallocMark = OsLmsLosMallocMark, .freeMark = OsLmsLosFreeMark, .simpleMark = OsLmsSimpleMark, @@ -609,7 +609,7 @@ VOID OsLmsReportError(UINTPTR p, UINT32 size, UINT32 errMod) LMS_LOCK(intSave); g_checkDepth += 1; - (VOID)memset(&info, 0, sizeof(LmsAddrInfo)); + (VOID)memset_s(&info, sizeof(LmsAddrInfo), 0, sizeof(LmsAddrInfo)); PRINT_ERR("***** Kernel Address Sanitizer Error Detected Start *****\n"); diff --git a/components/lms/los_lms_pri.h b/components/lms/los_lms_pri.h index de9cced4..294418aa 100644 --- a/components/lms/los_lms_pri.h +++ b/components/lms/los_lms_pri.h @@ -95,6 +95,7 @@ typedef struct { typedef struct { UINT32 (*init)(const VOID *pool, UINT32 size); + VOID (*deInit)(const VOID *pool); VOID (*mallocMark)(const VOID *curNodeStart, const VOID *nextNodeStart, UINT32 nodeHeadSize); VOID (*freeMark)(const VOID *curNodeStart, const VOID *nextNodeStart, UINT32 nodeHeadSize); VOID (*simpleMark)(UINTPTR startAddr, UINTPTR endAddr, UINT32 value); @@ -133,4 +134,4 @@ extern SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_handle_no_return(VOID); #endif /* __cplusplus */ #endif /* __cplusplus */ -#endif /* _LOS_LMS_PRI_H */ \ No newline at end of file +#endif /* _LOS_LMS_PRI_H */ diff --git a/kernel/src/mm/los_memory.c b/kernel/src/mm/los_memory.c index 56cf298c..2b0a5388 100644 --- a/kernel/src/mm/los_memory.c +++ b/kernel/src/mm/los_memory.c @@ -474,7 +474,7 @@ RETRY: OsMemFreeNodeAdd(pool, (struct OsMemFreeNodeHead *)newNode); endNode = OS_MEM_END_NODE(newNode, size); - (VOID)memset(endNode, 0, sizeof(*endNode)); + (VOID)memset_s(endNode, sizeof(*endNode), 0, sizeof(*endNode)); endNode->ptr.next = NULL; OS_MEM_SET_MAGIC(endNode); OsMemSentinelNodeSet(endNode, NULL, 0); @@ -584,7 +584,8 @@ STATIC INLINE VOID OsMemLeakCheckInfoRecord(struct OsMemNodeHead *node) STATIC INLINE VOID OsMemLeakCheckInit(VOID) { - (VOID)memset(g_leakCheckRecord, 0, sizeof(struct OsMemLeakCheckInfo) * LOSCFG_MEM_LEAKCHECK_RECORD_MAX_NUM); + (VOID)memset_s(g_leakCheckRecord, sizeof(struct OsMemLeakCheckInfo) * LOSCFG_MEM_LEAKCHECK_RECORD_MAX_NUM, + 0, sizeof(struct OsMemLeakCheckInfo) * LOSCFG_MEM_LEAKCHECK_RECORD_MAX_NUM); g_leakCheckRecordCnt = 0; } @@ -858,6 +859,9 @@ STATIC UINT32 OsMemPoolInit(VOID *pool, UINT32 size) struct OsMemPoolHead *poolHead = (struct OsMemPoolHead *)pool; struct OsMemNodeHead *newNode = NULL; struct OsMemNodeHead *endNode = NULL; + + (VOID)memset_s(poolHead, size, 0, sizeof(struct OsMemPoolHead)); + #ifdef LOSCFG_KERNEL_LMS UINT32 resize = 0; if (g_lms != NULL) { @@ -869,7 +873,6 @@ STATIC UINT32 OsMemPoolInit(VOID *pool, UINT32 size) size = (resize == 0) ? size : resize; } #endif - (VOID)memset(poolHead, 0, sizeof(struct OsMemPoolHead)); poolHead->info.pool = pool; poolHead->info.totalSize = size; @@ -907,9 +910,14 @@ STATIC UINT32 OsMemPoolInit(VOID *pool, UINT32 size) } #if (LOSCFG_MEM_MUL_POOL == 1) -STATIC VOID OsMemPoolDeinit(VOID *pool) +STATIC VOID OsMemPoolDeInit(VOID *pool, UINT32 size) { - (VOID)memset(pool, 0, sizeof(struct OsMemPoolHead)); +#ifdef LOSCFG_KERNEL_LMS + if (g_lms != NULL) { + g_lms->deInit(pool); + } +#endif + (VOID)memset_s(pool, size, 0, sizeof(struct OsMemPoolHead)); } STATIC UINT32 OsMemPoolAdd(VOID *pool, UINT32 size) @@ -988,7 +996,7 @@ UINT32 LOS_MemInit(VOID *pool, UINT32 size) #if (LOSCFG_MEM_MUL_POOL == 1) if (OsMemPoolAdd(pool, size)) { - (VOID)OsMemPoolDeinit(pool); + (VOID)OsMemPoolDeInit(pool, size); return LOS_NOK; } #endif @@ -1001,17 +1009,23 @@ UINT32 LOS_MemInit(VOID *pool, UINT32 size) #if (LOSCFG_MEM_MUL_POOL == 1) UINT32 LOS_MemDeInit(VOID *pool) { - if (pool == NULL) { + struct OsMemPoolHead *tmpPool = (struct OsMemPoolHead *)pool; + + if (tmpPool == NULL) { return LOS_NOK; } - if (OsMemPoolDelete(pool)) { + if ((tmpPool->info.pool != pool) || (tmpPool->info.totalSize <= OS_MEM_MIN_POOL_SIZE)) { return LOS_NOK; } - OsMemPoolDeinit(pool); + if (OsMemPoolDelete(tmpPool)) { + return LOS_NOK; + } - OsHookCall(LOS_HOOK_TYPE_MEM_DEINIT, pool); + OsMemPoolDeInit(tmpPool, tmpPool->info.totalSize); + + OsHookCall(LOS_HOOK_TYPE_MEM_DEINIT, tmpPool); return LOS_OK; } @@ -1950,7 +1964,7 @@ UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus) return LOS_NOK; } - (VOID)memset(poolStatus, 0, sizeof(LOS_MEM_POOL_STATUS)); + (VOID)memset_s(poolStatus, sizeof(LOS_MEM_POOL_STATUS), 0, sizeof(LOS_MEM_POOL_STATUS)); OsAllMemNodeDoHandle(pool, OsMemNodeInfoGetHandle, (VOID *)poolStatus); @@ -2232,7 +2246,7 @@ STATIC VOID OsMemExcInfoGetSub(struct OsMemPoolHead *pool, MemInfoCB *memExcInfo UINT32 taskID = OS_TASK_ERRORID; UINT32 intSave = 0; - (VOID)memset(memExcInfo, 0, sizeof(MemInfoCB)); + (VOID)memset_s(memExcInfo, sizeof(MemInfoCB), 0, sizeof(MemInfoCB)); MEM_LOCK(pool, intSave); memExcInfo->type = MEM_MANG_MEMORY;