From e92041535eae311baf6f6f8259dff2851359d2e1 Mon Sep 17 00:00:00 2001 From: lichao Date: Tue, 26 Dec 2023 23:32:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89=E7=85=A7=E7=BC=96=E7=A0=81=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lichao --- interfaces/inner_api/syscap_interface.c | 28 +++++++++---- src/create_pcid.c | 19 ++++++--- src/syscap_tool.c | 56 ++++++++++++++++++------- 3 files changed, 74 insertions(+), 29 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 73e9cdd..9fd163b 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -374,7 +374,6 @@ static void PrintResultToOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDeco if (ret == -1) { PRINT_ERR("sprintf_s failed.\n"); free(outBuffer); - outBuffer = NULL; return; } for (i = 1; i < RPCID_OUT_BUFFER; i++) { @@ -382,7 +381,6 @@ static void PrintResultToOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDeco if (ret == -1) { PRINT_ERR("sprintf_s failed.\n"); free(outBuffer); - outBuffer = NULL; return; } } @@ -392,7 +390,6 @@ static void PrintResultToOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDeco if (ret == -1) { PRINT_ERR("sprintf_s failed.\n"); free(outBuffer); - outBuffer = NULL; return; } } @@ -413,8 +410,13 @@ static void PartSysCapAndOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDeco // part os syscap and ptivate syscap for (i = 0; i < (uint32_t)freeAfterDecodeRpcidInfo.sysCapArraySize; i++) { cJSON *cJsonItem = cJSON_GetArrayItem(sysCapArray, i); + if (cJsonItem->valuestring == NULL) { + cJSON_Delete(cJsonItem); + return; + } + cJsonTemp = cJSON_GetObjectItem(freeAfterDecodeRpcidInfo.sysCapDefine, cJsonItem->valuestring); - if (cJsonTemp != NULL) { + if (cJsonTemp != NULL && cJSON_IsNumber(cJsonTemp)) { freeAfterDecodeRpcidInfo.osSysCapIndex[indexOs++] = (uint16_t)(cJsonTemp->valueint); } else { ret = strcpy_s(freeAfterDecodeRpcidInfo.priSyscap, SINGLE_SYSCAP_LEN, cJsonItem->valuestring); @@ -435,16 +437,26 @@ static char *FreeAfterDecodeRpcidToString(struct FreeAfterDecodeRpcidInfo freeAf switch (type) { case FREE_MALLOC_PRISYSCAP_AFTER_DECODE_RPCID: free(freeAfterDecodeRpcidInfo.priSyscap); - /* fall-through */ + free(freeAfterDecodeRpcidInfo.osSysCapIndex); + cJSON_Delete(freeAfterDecodeRpcidInfo.sysCapDefine); + cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot); + FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer); + break; case FREE_MALLOC_OSSYSCAP_AFTER_DECODE_RPCID: free(freeAfterDecodeRpcidInfo.osSysCapIndex); - /* fall-through */ + cJSON_Delete(freeAfterDecodeRpcidInfo.sysCapDefine); + cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot); + FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer); + break; case FREE_WHOLE_SYSCAP_AFTER_DECODE_RPCID: cJSON_Delete(freeAfterDecodeRpcidInfo.sysCapDefine); - /* fall-through */ + cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot); + FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer); + break; case FREE_RPCID_ROOT_AFTER_DECODE_RPCID: cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot); - /* fall-through */ + FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer); + break; case FREE_CONTEXT_OUT_AFTER_DECODE_RPCID: default: FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer); diff --git a/src/create_pcid.c b/src/create_pcid.c index 92cf6bd..7ad15aa 100644 --- a/src/create_pcid.c +++ b/src/create_pcid.c @@ -427,13 +427,19 @@ static int32_t FreeAfterDecodePCID(struct FreeDecodePcidJsonInfo freePcidJsonInf switch (type) { case FREE_DECODE_PCID_CONVERT_OUT: free(freePcidJsonInfo.strJson); - /* fall-through */ + cJSON_Delete(freePcidJsonInfo.jsonRootObj); + cJSON_Delete(freePcidJsonInfo.sysCapObj); + FreeContextBuffer(freePcidJsonInfo.contextBuffer); + break; case FREE_DECODE_PCID_ROOT_OUT: cJSON_Delete(freePcidJsonInfo.jsonRootObj); - /* fall-through */ + cJSON_Delete(freePcidJsonInfo.sysCapObj); + FreeContextBuffer(freePcidJsonInfo.contextBuffer); + break; case FREE_DECODE_PCID_SYSCAP_OUT: cJSON_Delete(freePcidJsonInfo.sysCapObj); - /* fall-through */ + FreeContextBuffer(freePcidJsonInfo.contextBuffer); + break; case FREE_DECODE_PCID_CONTEXT_OUT: default: FreeContextBuffer(freePcidJsonInfo.contextBuffer); @@ -722,10 +728,13 @@ static int32_t FreeAfterEncodePCID(struct FreeEncodePcidInfo freePcidInfo, int32 switch (type) { case FREE_ENCODE_PCID_OUT: free(freePcidInfo.output); - /* fall-through */ + free(freePcidInfo.priSyscapFull); + free(freePcidInfo.contextBuffer); + break; case FREE_ENCODE_PCID_PRISYSCAP_FULL_OUT: free(freePcidInfo.priSyscapFull); - /* fall-through */ + free(freePcidInfo.contextBuffer); + break; case FREE_ENCODE_PCID_CONTEXT_OUT: default: free(freePcidInfo.contextBuffer); diff --git a/src/syscap_tool.c b/src/syscap_tool.c index 1bc98ea..cf66e7d 100644 --- a/src/syscap_tool.c +++ b/src/syscap_tool.c @@ -95,6 +95,11 @@ static int32_t FillOsCapLength(char *convertedBuffer, char *contextBuffer, struc fillTmpPtr += sizeof(uint16_t); for (uint32_t i = 0; i < sysCapSize; i++) { arrayItemPtr = cJSON_GetArrayItem(gJsonObjectSysCap.sysCapPtr, (int)i); + if (arrayItemPtr->valuestring == NULL) { + PRINT_ERR("arrayItemPtr->valuestring is NULL\n"); + return -1; + } + char *pointPos = strchr(arrayItemPtr->valuestring, '.'); if (pointPos == NULL) { PRINT_ERR("context of \"syscap\" array is invalid\n"); @@ -287,10 +292,19 @@ static int SetOsSysCapBitMap(uint8_t *out, uint16_t outLen, const uint16_t *inde return 0; } -static int32_t PrintOutputToFile(struct FreeAfterEncodeRpcidscInfo freeAfterEncodeRpcidscInfo, uint16_t outBufferLen, +static int32_t PrintOutputToFile(struct FreeAfterEncodeRpcidscInfo freeAfterEncodeRpcidscInfo, uint32_t outUint[RPCID_OUT_BUFFER], uint16_t indexPri, char *outDirPath) { int32_t ret = 0; + + uint16_t outBufferLen = U32_TO_STR_MAX_LEN * RPCID_OUT_BUFFER + SINGLE_SYSCAP_LEN * indexPri; + freeAfterEncodeRpcidscInfo.outBuffer = (char *)malloc(outBufferLen); + if (freeAfterEncodeRpcidscInfo.outBuffer == NULL) { + PRINT_ERR("malloc(%u) failed.\n", outBufferLen); + freeAfterEncodeRpcidscInfo.flag = 1; + return ret; + } + freeAfterEncodeRpcidscInfo.type = FREE_OUTBUFFER_AFTER_RPCIDSC; (void)memset_s(freeAfterEncodeRpcidscInfo.outBuffer, outBufferLen, 0, outBufferLen); ret = sprintf_s(freeAfterEncodeRpcidscInfo.outBuffer, outBufferLen, "%u", outUint[0]); @@ -354,8 +368,11 @@ static int32_t OutputSetMemAndPrintToFile(struct FreeAfterEncodeRpcidscInfo free uint16_t indexOs = 0; for (int i = 0; i < sysCapArraySize; i++) { cJSON *cJsonItem = cJSON_GetArrayItem(sysCapArray, i); + if (cJsonItem->valuestring == NULL) { + continue; + } cJsonTemp = cJSON_GetObjectItem(freeAfterEncodeRpcidscInfo.sysCapDefine, cJsonItem->valuestring); - if (cJsonTemp != NULL) { + if (cJsonTemp != NULL && cJSON_IsNumber(cJsonTemp)) { freeAfterEncodeRpcidscInfo.osSysCapIndex[indexOs++] = (uint16_t)(cJsonTemp->valueint); } else { ret = strcpy_s(priSyscap, SINGLE_SYSCAP_LEN, cJsonItem->valuestring); @@ -378,15 +395,7 @@ static int32_t OutputSetMemAndPrintToFile(struct FreeAfterEncodeRpcidscInfo free freeAfterEncodeRpcidscInfo.flag = 1; return ret; } - - uint16_t outBufferLen = U32_TO_STR_MAX_LEN * RPCID_OUT_BUFFER + SINGLE_SYSCAP_LEN * indexPri; - freeAfterEncodeRpcidscInfo.outBuffer = (char *)malloc(outBufferLen); - if (freeAfterEncodeRpcidscInfo.outBuffer == NULL) { - PRINT_ERR("malloc(%u) failed.\n", outBufferLen); - freeAfterEncodeRpcidscInfo.flag = 1; - return ret; - } - return PrintOutputToFile(freeAfterEncodeRpcidscInfo, outBufferLen, outUint, indexPri, outDirPath); + return PrintOutputToFile(freeAfterEncodeRpcidscInfo, outUint, indexPri, outDirPath); } static int32_t FreeAfterEncodeRpcidsc(struct FreeAfterEncodeRpcidscInfo freeAfterEncodeRpcidscInfo, int32_t type, @@ -395,19 +404,34 @@ static int32_t FreeAfterEncodeRpcidsc(struct FreeAfterEncodeRpcidscInfo freeAfte switch (type) { case FREE_OUTBUFFER_AFTER_RPCIDSC: free(freeAfterEncodeRpcidscInfo.outBuffer); - /* fall-through */ + free(freeAfterEncodeRpcidscInfo.priSyscapArray); + free(freeAfterEncodeRpcidscInfo.osSysCapIndex); + cJSON_Delete(freeAfterEncodeRpcidscInfo.sysCapDefine); + cJSON_Delete(freeAfterEncodeRpcidscInfo.rpcidRoot); + FreeContextBuffer(freeAfterEncodeRpcidscInfo.contextBuffer); + break; case FREE_MALLOC_RPISYSCAP_AFTER_RPCIDSC: free(freeAfterEncodeRpcidscInfo.priSyscapArray); - /* fall-through */ + free(freeAfterEncodeRpcidscInfo.osSysCapIndex); + cJSON_Delete(freeAfterEncodeRpcidscInfo.sysCapDefine); + cJSON_Delete(freeAfterEncodeRpcidscInfo.rpcidRoot); + FreeContextBuffer(freeAfterEncodeRpcidscInfo.contextBuffer); + break; case FREE_MALLOC_OSSYSCAP_AFTER_RPCIDSC: free(freeAfterEncodeRpcidscInfo.osSysCapIndex); - /* fall-through */ + cJSON_Delete(freeAfterEncodeRpcidscInfo.sysCapDefine); + cJSON_Delete(freeAfterEncodeRpcidscInfo.rpcidRoot); + FreeContextBuffer(freeAfterEncodeRpcidscInfo.contextBuffer); + break; case FREE_WHOLE_SYSCAP_AFTER_RPCIDSC: cJSON_Delete(freeAfterEncodeRpcidscInfo.sysCapDefine); - /* fall-through */ + cJSON_Delete(freeAfterEncodeRpcidscInfo.rpcidRoot); + FreeContextBuffer(freeAfterEncodeRpcidscInfo.contextBuffer); + break; case FREE_RPCID_ROOT_AFTER_RPCIDSC: cJSON_Delete(freeAfterEncodeRpcidscInfo.rpcidRoot); - /* fall-through */ + FreeContextBuffer(freeAfterEncodeRpcidscInfo.contextBuffer); + break; case FREE_CONTEXT_OUT_AFTER_RPCIDSC: default: FreeContextBuffer(freeAfterEncodeRpcidscInfo.contextBuffer); -- Gitee