From f970d569a28c971b190e63bde6be18707562372d Mon Sep 17 00:00:00 2001 From: luming Date: Fri, 23 Aug 2024 16:02:56 +0800 Subject: [PATCH] [Bug] Reconstruct code of function `DecodePCID` issueNo: https://gitee.com/openharmony/developtools_syscap_codec/issues/IAKW57 Signed-off-by: luming --- interfaces/inner_api/syscap_interface.c | 4 +- src/common_method.c | 20 ++- src/common_method.h | 9 +- src/create_pcid.c | 165 +++++++++--------------- src/syscap_tool.c | 12 +- 5 files changed, 90 insertions(+), 120 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 0580c69..4e05be9 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -448,8 +448,8 @@ static char *FreeAfterDecodeRpcidToString(struct FreeAfterDecodeRpcidInfo freeAf { switch (type) { case FREE_MALLOC_PRISYSCAP_AFTER_DECODE_RPCID: - SafeFree(freeAfterDecodeRpcidInfo.priSyscap); - free(freeAfterDecodeRpcidInfo.osSysCapIndex); + const int freePtrCount = 2; + SafeFree(freePtrCount, freeAfterDecodeRpcidInfo.priSyscap, common_ptr, freeAfterDecodeRpcidInfo.osSysCapIndex, common_ptr); cJSON_Delete(freeAfterDecodeRpcidInfo.sysCapDefine); cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot); FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer); diff --git a/src/common_method.c b/src/common_method.c index cf7880f..be60860 100644 --- a/src/common_method.c +++ b/src/common_method.c @@ -15,10 +15,24 @@ #include "common_method.h" #include +#include "cJSON.h" -void SafeFree(char *pointer) +void SafeFree(int count, ...) { - if ((pointer) != NULL) { - free(pointer); + va_list args; + va_start(args, count); + for (int i = 0; i < count; i++) { + void *ptr = va_arg(args, void*); + enum FREE_ARGS_TYPE argsType = va_arg(args, int); + if (ptr != NULL) { + if (argsType == common_ptr) { + free(ptr); + } else if (argsType == cJson_print_ptr) { + cJSON_free(ptr); + } else if (argsType == cJSON_object_ptr) { + cJSON_Delete(ptr); + } + } } + va_end(args); } diff --git a/src/common_method.h b/src/common_method.h index a9030bb..e814aa7 100644 --- a/src/common_method.h +++ b/src/common_method.h @@ -17,7 +17,14 @@ #define COMMON_METHOD_H #include +#include -void SafeFree(char *pointer); +enum FREE_ARGS_TYPE { + common_ptr, + cJson_print_ptr, + cJSON_object_ptr +}; + +void SafeFree(int count,...); #endif \ No newline at end of file diff --git a/src/create_pcid.c b/src/create_pcid.c index 7b99567..0c0b573 100644 --- a/src/create_pcid.c +++ b/src/create_pcid.c @@ -30,7 +30,9 @@ #ifdef SYSCAP_DEFINE_EXTERN_ENABLE #include "syscap_define_custom.h" #else + #include "syscap_define.h" + #endif #define SYSCAP_PREFIX_LEN 17 @@ -64,7 +66,6 @@ struct FreeDecodePcidJsonInfo { char *contextBuffer; cJSON *jsonRootObj; cJSON *sysCapObj; - int32_t flag; }; int32_t SetOsSyscap(PCIDMain *pcidBuffer, uint32_t osCapSize, @@ -405,25 +406,26 @@ static int32_t GetPriSyscap(PCIDMain *pcidMain, cJSON *sysCapObject, int32_t con } static int32_t CheckSysCapObj(struct FreeDecodePcidJsonInfo freePcidJsonInfo, PCIDMain *pcidMain, - uint32_t contextBufLen, int32_t ret) + uint32_t contextBufLen) { if (freePcidJsonInfo.sysCapObj == NULL) { PRINT_ERR("cJSON_CreateObject failed\n"); - freePcidJsonInfo.flag = -1; return -1; } if (GetOsSyscap(pcidMain, freePcidJsonInfo.sysCapObj) != 0) { - freePcidJsonInfo.flag = -1; - return ret; + return -1; } if (GetPriSyscap(pcidMain, freePcidJsonInfo.sysCapObj, contextBufLen) != 0) { - freePcidJsonInfo.flag = -1; + return -1; } - return ret; + return 0; } -static int32_t CheckJsonRootObj(struct FreeDecodePcidJsonInfo freePcidJsonInfo, PCIDMain *pcidMain, char *systemType) -{ +static int32_t CheckJsonRootObj(struct FreeDecodePcidJsonInfo freePcidJsonInfo, PCIDMain *pcidMain, char *systemType) { + if (freePcidJsonInfo.jsonRootObj == NULL) { + PRINT_ERR("cJSON_CreateObject failed\n"); + return -1; + } if (!cJSON_AddNumberToObject(freePcidJsonInfo.jsonRootObj, "api_version", NtohsInter(pcidMain->apiVersion))) { PRINT_ERR("cJSON_AddNumberToObject failed\n"); return -1; @@ -444,103 +446,58 @@ static int32_t CheckJsonRootObj(struct FreeDecodePcidJsonInfo freePcidJsonInfo, return 0; } -static int32_t FreeAfterDecodePCID(struct FreeDecodePcidJsonInfo freePcidJsonInfo, int32_t type, int32_t ret) +static void FreeAfterDecodePCID(struct FreeDecodePcidJsonInfo freePcidJsonInfo) { - switch (type) { - case FREE_DECODE_PCID_CONVERT_OUT: - cJSON_free(freePcidJsonInfo.strJson); - cJSON_Delete(freePcidJsonInfo.jsonRootObj); - FreeContextBuffer(freePcidJsonInfo.contextBuffer); - break; - case FREE_DECODE_PCID_ROOT_OUT: - cJSON_Delete(freePcidJsonInfo.jsonRootObj); - cJSON_Delete(freePcidJsonInfo.sysCapObj); - FreeContextBuffer(freePcidJsonInfo.contextBuffer); - break; - case FREE_DECODE_PCID_SYSCAP_OUT: - cJSON_Delete(freePcidJsonInfo.sysCapObj); - FreeContextBuffer(freePcidJsonInfo.contextBuffer); - break; - case FREE_DECODE_PCID_CONTEXT_OUT: - cJSON_Delete(freePcidJsonInfo.sysCapObj); - FreeContextBuffer(freePcidJsonInfo.contextBuffer); - break; - default: - FreeContextBuffer(freePcidJsonInfo.contextBuffer); - } - return ret; + const int freePtrCount = 2; + SafeFree(freePtrCount, freePcidJsonInfo.strJson, cJson_print_ptr, freePcidJsonInfo.jsonRootObj, cJSON_object_ptr); + FreeContextBuffer(freePcidJsonInfo.contextBuffer); } int32_t DecodePCID(char *inputFile, char *outDirPath) { - int32_t ret = 0; + int32_t ret = -1; uint32_t contextBufLen; struct FreeDecodePcidJsonInfo freePcidJsonInfo; freePcidJsonInfo.strJson = NULL; freePcidJsonInfo.contextBuffer = NULL; freePcidJsonInfo.jsonRootObj = NULL; freePcidJsonInfo.sysCapObj = NULL; - freePcidJsonInfo.flag = 0; - - ret = GetFileContext(inputFile, &freePcidJsonInfo.contextBuffer, (uint32_t *)&contextBufLen); - if (ret != 0) { - PRINT_ERR("GetFileContext failed, input file : %s\n", inputFile); - return -1; - } - - PCIDMain *pcidMain = (PCIDMain *)freePcidJsonInfo.contextBuffer; - - /* api version */ - if (pcidMain->apiVersionType != 0) { - PRINT_ERR("Prase file failed, apiVersionType is invaild, input file : %s\n", inputFile); - return FreeAfterDecodePCID(freePcidJsonInfo, FREE_DECODE_PCID_CONTEXT_OUT, -1); - } - - /* system type */ - char *systemType = pcidMain->systemType == 0b001 ? "mini" : - (pcidMain->systemType == 0b010 ? "small" : - (pcidMain->systemType == 0b100 ? "standard" : NULL)); - if (systemType == NULL) { - PRINT_ERR("prase file failed, systemType is invaild, %u\n", pcidMain->systemType); - return FreeAfterDecodePCID(freePcidJsonInfo, FREE_DECODE_PCID_CONTEXT_OUT, -1); - } - - /* syscap */ - freePcidJsonInfo.sysCapObj = cJSON_CreateObject(); - ret = CheckSysCapObj(freePcidJsonInfo, pcidMain, contextBufLen, ret); - if (freePcidJsonInfo.flag == -1) { - return FreeAfterDecodePCID(freePcidJsonInfo, FREE_DECODE_PCID_CONTEXT_OUT, ret); - } - - // create json root - freePcidJsonInfo.jsonRootObj = cJSON_CreateObject(); - if (freePcidJsonInfo.jsonRootObj == NULL) { - PRINT_ERR("cJSON_CreateObject failed\n"); - return FreeAfterDecodePCID(freePcidJsonInfo, FREE_DECODE_PCID_SYSCAP_OUT, -1); - } - - ret = CheckJsonRootObj(freePcidJsonInfo, pcidMain, systemType); - if (ret == -1) { - return FreeAfterDecodePCID(freePcidJsonInfo, FREE_DECODE_PCID_ROOT_OUT, ret); - } - - freePcidJsonInfo.strJson = cJSON_Print(freePcidJsonInfo.jsonRootObj); - - const char outputFileName[] = "pcid.json"; - ret = ConvertedContextSaveAsFile(outDirPath, outputFileName, freePcidJsonInfo.strJson, - strlen(freePcidJsonInfo.strJson)); - if (ret != 0) { - PRINT_ERR("ConvertedContextSaveAsFile failed, outDirPath:%s, filename:%s\n", outDirPath, outputFileName); + if (GetFileContext(inputFile, &freePcidJsonInfo.contextBuffer, (uint32_t *) &contextBufLen) == 0) { + PCIDMain *pcidMain = (PCIDMain *) freePcidJsonInfo.contextBuffer; + if (pcidMain->apiVersionType == 0) { + /* system type */ + char *systemType = pcidMain->systemType == 0b001 ? "mini" : + (pcidMain->systemType == 0b010 ? "small" : + (pcidMain->systemType == 0b100 ? "standard" : NULL)); + if (systemType != NULL) { + /* syscap */ + freePcidJsonInfo.sysCapObj = cJSON_CreateObject(); + // create json root + freePcidJsonInfo.jsonRootObj = cJSON_CreateObject(); + if (CheckSysCapObj(freePcidJsonInfo, pcidMain, contextBufLen) == 0 && + CheckJsonRootObj(freePcidJsonInfo, pcidMain, systemType) == 0) { + freePcidJsonInfo.strJson = cJSON_Print(freePcidJsonInfo.jsonRootObj); + const char outputFileName[] = "pcid.json"; + ret = ConvertedContextSaveAsFile(outDirPath, outputFileName, freePcidJsonInfo.strJson, + strlen(freePcidJsonInfo.strJson)); + } + }else{ + PRINT_ERR("Parse file failed, systemType is invalid, %u\n", pcidMain->systemType); + } + }else{ + PRINT_ERR("Parse file failed, apiVersionType is invalid, input file : %s\n", inputFile); + } } - return FreeAfterDecodePCID(freePcidJsonInfo, FREE_DECODE_PCID_CONVERT_OUT, ret); + FreeAfterDecodePCID(freePcidJsonInfo); + return ret; } #define U32_TO_STR_MAX_LEN 11 #define OS_SYSCAP_NUM 30 #define PCID_HEADER 2 + static int32_t ParseStringSyscap(char *input, uint32_t *osSyscap, uint32_t osSyscapNum, - uint32_t *header, uint32_t headerLen) -{ + uint32_t *header, uint32_t headerLen) { int32_t ret; uint32_t tempNum; uint32_t i = 0; @@ -574,18 +531,17 @@ static int32_t ParseStringSyscap(char *input, uint32_t *osSyscap, uint32_t osSys return 0; } -static int32_t AddHeaderToJsonObj(uint32_t *pcidHeader, uint32_t pcidHeaderLen, cJSON *rootObj) -{ +static int32_t AddHeaderToJsonObj(uint32_t *pcidHeader, uint32_t pcidHeaderLen, cJSON *rootObj) { if (pcidHeaderLen != PCID_HEADER) { PRINT_ERR("input pcidHeader(%u) error.\n", pcidHeaderLen); return -1; } - PCIDHeader *header = (PCIDHeader *)pcidHeader; + PCIDHeader *header = (PCIDHeader *) pcidHeader; // trans system type to string - char *systemType = header->systemType == 0b001 ? "mini" : + char *systemType = header->systemType == 0b001 ? "mini" : (header->systemType == 0b010 ? "small" : - (header->systemType == 0b100 ? "standard" : NULL)); + (header->systemType == 0b100 ? "standard" : NULL)); if (systemType == NULL) { PRINT_ERR("prase system type failed.\n"); return -1; @@ -607,8 +563,7 @@ static int32_t AddHeaderToJsonObj(uint32_t *pcidHeader, uint32_t pcidHeaderLen, return 0; } -static int32_t AddOsSyscapToJsonObj(uint32_t *osSyscapArray, uint32_t osSyscapArrayLen, cJSON *sysCapObj) -{ +static int32_t AddOsSyscapToJsonObj(uint32_t *osSyscapArray, uint32_t osSyscapArrayLen, cJSON *sysCapObj) { cJSON *sysCapArray = cJSON_CreateArray(); if (sysCapArray == NULL) { PRINT_ERR("Create cJSON array failed.\n"); @@ -620,7 +575,7 @@ static int32_t AddOsSyscapToJsonObj(uint32_t *osSyscapArray, uint32_t osSyscapAr free(sysCapArray); return -1; } - uint8_t *osSysCapArrayUint8 = (uint8_t *)osSyscapArray; + uint8_t *osSysCapArrayUint8 = (uint8_t *) osSyscapArray; uint32_t i, j; uint32_t osSyscapCount = 0; @@ -655,8 +610,7 @@ static int32_t AddOsSyscapToJsonObj(uint32_t *osSyscapArray, uint32_t osSyscapAr return 0; } -static int32_t AddPriSyscapToJsonObj(char *priSyscapString, uint32_t priSyscapStringLen, cJSON *sysCapObj) -{ +static int32_t AddPriSyscapToJsonObj(char *priSyscapString, uint32_t priSyscapStringLen, cJSON *sysCapObj) { char *token = NULL; cJSON *sysCapArray = cJSON_CreateArray(); @@ -691,11 +645,10 @@ static int32_t AddPriSyscapToJsonObj(char *priSyscapString, uint32_t priSyscapSt return 0; } -static int32_t GetSyscapStr(char *input, char const *priSyscapStr, uint32_t* osSyscap, uint32_t *pcidHeader) -{ +static int32_t GetSyscapStr(char *input, char const *priSyscapStr, uint32_t *osSyscap, uint32_t *pcidHeader) { char *ctx = NULL; uint32_t fileContextLen; - if (GetFileContext(input, &ctx, (uint32_t *)&fileContextLen) != 0) { + if (GetFileContext(input, &ctx, (uint32_t *) &fileContextLen) != 0) { PRINT_ERR("GetFileContext failed, input file : %s\n", input); return -1; } @@ -708,8 +661,7 @@ static int32_t GetSyscapStr(char *input, char const *priSyscapStr, uint32_t* osS return 0; } -int32_t DecodeStringPCIDToJson(char *input, char *outDirPath) -{ +int32_t DecodeStringPCIDToJson(char *input, char *outDirPath) { int32_t ret = -1; uint32_t osSyscap[OS_SYSCAP_NUM] = {0}; uint32_t pcidHeader[PCID_HEADER]; @@ -759,10 +711,9 @@ int32_t DecodeStringPCIDToJson(char *input, char *outDirPath) ret = 0; FAILED: - cJSON_free(jsonBuffer); - SafeFree(priSyscapStr); - cJSON_Delete(sysCapObj); - cJSON_Delete(rootObj); + const int freePtrCount = 4; + SafeFree(freePtrCount, jsonBuffer, cJson_print_ptr, priSyscapStr, common_ptr, sysCapObj, cJSON_object_ptr, rootObj, + cJSON_object_ptr); return ret; } diff --git a/src/syscap_tool.c b/src/syscap_tool.c index 4ff330a..db35372 100644 --- a/src/syscap_tool.c +++ b/src/syscap_tool.c @@ -72,12 +72,10 @@ struct FreeAfterEncodeRpcidscInfo { int16_t flag; }; -static void FreePointerMemory(char *pcidContent, char *rpcidContent, char *pcidPriSyscap, char *rpcidPriSyscap) -{ - SafeFree(pcidContent); - SafeFree(rpcidPriSyscap); - SafeFree(rpcidContent); - SafeFree(pcidPriSyscap); +static void FreePointerMemory(char *pcidContent, char *rpcidContent, char *pcidPriSyscap, char *rpcidPriSyscap) { + const int freePtrCount = 4; + SafeFree(freePtrCount, pcidContent, common_ptr, rpcidPriSyscap, common_ptr, rpcidContent, common_ptr, pcidPriSyscap, + common_ptr); } static int32_t FillOsCapLength(char *convertedBuffer, char *contextBuffer, struct JsonObjectSysCap gJsonObjectSysCap, @@ -271,7 +269,7 @@ int32_t RPCIDDecode(char *inputFile, char *outputPath) // parse rpcid to json cJSON *rpcidRoot = cJSON_CreateObject(); if (ParseRpcidToJson(contextBuffer, bufferLen, rpcidRoot) != 0) { - PRINT_ERR("Prase rpcid to json failed. Input failed: %s\n", inputFile); + PRINT_ERR("Parse rpcid to json failed. Input failed: %s\n", inputFile); goto FREE_RPCID_ROOT; } -- Gitee