diff --git a/include/create_pcid.h b/include/create_pcid.h index f2cf99c20ed1b299f18e25df28387592e8e8159b..67827b1fb8f527a6d1f55be1ea4ba6a2035f65aa 100644 --- a/include/create_pcid.h +++ b/include/create_pcid.h @@ -37,6 +37,7 @@ typedef struct PcidHeader { uint32_t manufacturerID; } PCIDHeader; +void SafeFree(void *ptr); int32_t CreatePCID(char *inputFile, char *outDirPath); int32_t DecodePCID(char *inputFile, char *outDirPath); int32_t DecodeStringPCIDToJson(char *input, char *outDirPath); diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 017eb5b7523edf5f04b7d9d111ae090cc219db0f..5582e25abba9a3de02f82dd6568bd753a62815a7 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -292,6 +292,11 @@ static int32_t ParseRpcidToJson(char *input, uint32_t inputLen, cJSON *rpcidJson char *sysCapBegin = input + sizeof(RPCIDHead) + sizeof(uint32_t); RPCIDHead *rpcidHeader = (RPCIDHead *)input; cJSON *sysCapJson = cJSON_CreateArray(); + if (sysCapJson == NULL) { + PRINT_ERR("Get SysCap failed, sysCapJson is empty.\n"); + ret = -1; + } + for (i = 0; i < sysCapCount; i++) { char *temp = sysCapBegin + i * SINGLE_FEAT_LEN; if (strlen(temp) >= SINGLE_FEAT_LEN) { @@ -495,6 +500,12 @@ char *DecodeRpcidToStringFormat(const char *inputFile) // parse rpcid to json freeAfterDecodeRpcidInfo.rpcidRoot = cJSON_CreateObject(); + if (freeAfterDecodeRpcidInfo.rpcidRoot == NULL) { + PRINT_ERR("Failed to create cJSON object for rpcidRoot\n"); + return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_RPCID_ROOT_AFTER_DECODE_RPCID, + outBuffer); + } + if (ParseRpcidToJson(freeAfterDecodeRpcidInfo.contextBuffer, bufferLen, freeAfterDecodeRpcidInfo.rpcidRoot)) { PRINT_ERR("Prase rpcid to json failed. Input file: %s\n", inputFile); return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_RPCID_ROOT_AFTER_DECODE_RPCID, outBuffer); diff --git a/napi/napi_query_syscap.cpp b/napi/napi_query_syscap.cpp index f089b365851032b39ec887fde6ce778207cef8ae..e8264cb7a569ffc3d4b7fada1beb0780f30487bb 100644 --- a/napi/napi_query_syscap.cpp +++ b/napi/napi_query_syscap.cpp @@ -140,6 +140,11 @@ static char* GetSystemCapability() } } retBool = DecodePrivateSyscap(priOutput, &priCapArray, &priCapArrayCnt); + if (priOutput == nullptr) { + PRINT_ERR("priOutput is unexpectedly NULL after DecodePrivateSyscap."); + goto FREE_PRIOUTPUT; + } + allSyscapBuffer = CalculateAllStringLength(osCapArray, priCapArray, retBool, priCapArrayCnt); free(priCapArray); diff --git a/src/context_tool.c b/src/context_tool.c index 1440a6bc3c60a28a667742b63f39c41140d630af..dd730a9cd4e1ef35476a1991cb0df5ca44a15aef 100644 --- a/src/context_tool.c +++ b/src/context_tool.c @@ -167,11 +167,13 @@ int32_t CheckRpcidFormat(const char *inputFile, char **buffer, uint32_t *len) sysCaptype = NtohsInter(*(uint16_t *)(rpcidHeader + 1)); if (sysCaptype != 2) { // 2, app syscap type PRINT_ERR("Parse file failed(sysCaptype != 2), input file : %s\n", inputFile); + free(contextBuffer); return -1; } sysCapLength = NtohsInter(*(uint16_t *)((char *)(rpcidHeader + 1) + sizeof(uint16_t))); if (bufferLen < sizeof(RPCIDHead) + sizeof(uint32_t) + sysCapLength) { PRINT_ERR("Parse file failed(SysCap length exceeded), input file : %s\n", inputFile); + free(contextBuffer); return -1; } diff --git a/src/create_pcid.c b/src/create_pcid.c index 64814f3534ccf058debc137375b6e2a8a1178a13..220a55b6225c6fb26a8d04ad7811a2514c53c10e 100644 --- a/src/create_pcid.c +++ b/src/create_pcid.c @@ -67,6 +67,14 @@ struct FreeDecodePcidJsonInfo { int32_t flag; }; +void SafeFree(void *ptr) +{ + if (ptr != NULL) { + free(ptr); + ptr = NULL; + } +} + int32_t SetOsSyscap(PCIDMain *pcidBuffer, uint32_t osCapSize, const cJSON *jsonOsSyscapObj, const cJSON *allOsSyscapObj) { @@ -265,7 +273,17 @@ int32_t CreatePCID(char *inputFile, char *outDirPath) } cJSON *jsonOsSyscapObj = cJSON_GetObjectItem(jsonSyscapObj, "os"); + if (jsonOsSyscapObj == NULL || !cJSON_IsObject(jsonOsSyscapObj)) { + PRINT_ERR("get \"os\" object failed\n"); + return PreFreeAfterCreatePCID(NULL, allOsSyscapObj, jsonRootObj, contextBuffer, 0); + } + cJSON *jsonPriSyscapObj = cJSON_GetObjectItem(jsonSyscapObj, "private"); + if (jsonPriSyscapObj == NULL || !cJSON_IsObject(jsonPriSyscapObj)) { + PRINT_ERR("get \"private\" object failed\n"); + return PreFreeAfterCreatePCID(NULL, allOsSyscapObj, jsonRootObj, contextBuffer, 0); + } + ret = GetOsAndPriSyscapSize(jsonOsSyscapObj, jsonPriSyscapObj, &osCapSize, &privateCapSize); if (ret != 0) { return PreFreeAfterCreatePCID(NULL, allOsSyscapObj, jsonRootObj, contextBuffer, 0); @@ -524,6 +542,11 @@ int32_t DecodePCID(char *inputFile, char *outDirPath) freePcidJsonInfo.sysCapObj = NULL; // avoid being released repeatedly. char *strJson = cJSON_Print(freePcidJsonInfo.jsonRootObj); + if (strJson == NULL) { + PRINT_ERR("cJSON_Print failed to generate JSON string\n"); + return FreeAfterDecodePCID(freePcidJsonInfo, FREE_DECODE_PCID_CONVERT_OUT, -1); + } + const char outputFileName[] = "pcid.json"; ret = ConvertedContextSaveAsFile(outDirPath, outputFileName, strJson, strlen(strJson)); if (ret != 0) { @@ -660,7 +683,6 @@ static int32_t AddPriSyscapToJsonObj(char *priSyscapString, uint32_t priSyscapSt cJSON *sysCapArray = cJSON_CreateArray(); if (sysCapArray == NULL) { PRINT_ERR("Create cJSON array failed.\n"); - free(sysCapArray); return -1; } if (priSyscapStringLen == 0) { @@ -696,7 +718,6 @@ static int32_t GetSyscapStr(char *input, char const *priSyscapStr, uint32_t* osS uint32_t fileContextLen; if (GetFileContext(input, &ctx, (uint32_t *)&fileContextLen) != 0) { PRINT_ERR("GetFileContext failed, input file : %s\n", input); - free(ctx); return -1; } if (ParseStringSyscap(ctx, osSyscap, OS_SYSCAP_NUM, pcidHeader, PCID_HEADER) != 0) { @@ -721,22 +742,22 @@ int32_t DecodeStringPCIDToJson(char *input, char *outDirPath) // add to json object cJSON *sysCapObj = cJSON_CreateObject(); - cJSON *rootObj = cJSON_CreateObject(); - if (!cJSON_AddItemToObject(rootObj, "syscap", sysCapObj)) { - PRINT_ERR("Add syscap to json failed.\n"); - goto ADD_JSON_FAILED; - } - if (AddHeaderToJsonObj(pcidHeader, PCID_HEADER, rootObj) != 0) { - PRINT_ERR("Add header to json object failed.\n"); - goto ADD_JSON_FAILED; + if (sysCapObj == NULL) { + free(priSyscapStr); + return -1; } - if (AddOsSyscapToJsonObj(osSyscap, OS_SYSCAP_NUM, sysCapObj) != 0) { - PRINT_ERR("Add os syscap json object failed.\n"); - goto ADD_JSON_FAILED; + + cJSON *rootObj = cJSON_CreateObject(); + if (rootObj == NULL) { + free(priSyscapStr); + return -1; } - if (AddPriSyscapToJsonObj(priSyscapStr, (uint32_t)strlen(priSyscapStr), sysCapObj) != 0) { - PRINT_ERR("Add private syscap json object failed.\n"); + if (!cJSON_AddItemToObject(rootObj, "syscap", sysCapObj) || + AddHeaderToJsonObj(pcidHeader, PCID_HEADER, rootObj) != 0 || + AddOsSyscapToJsonObj(osSyscap, OS_SYSCAP_NUM, sysCapObj) != 0 || + AddPriSyscapToJsonObj(priSyscapStr, (uint32_t)strlen(priSyscapStr), sysCapObj) != 0) { + PRINT_ERR("Faill to add JSON items.\n"); goto ADD_JSON_FAILED; } // save as json file @@ -756,6 +777,10 @@ int32_t DecodeStringPCIDToJson(char *input, char *outDirPath) SAVE_FAILED: free(jsonBuffer); ADD_JSON_FAILED: + if (priSyscapStr != NULL) { + free(priSyscapStr); + } + cJSON_Delete(sysCapObj); cJSON_Delete(rootObj); return ret; diff --git a/src/syscap_tool.c b/src/syscap_tool.c index b2ab4fdb4581cd1dbd7cd0b19f4e2d5e44e130a7..43b3489f47a4067a31c45014e8b1675fa8c4f1de 100644 --- a/src/syscap_tool.c +++ b/src/syscap_tool.c @@ -204,6 +204,11 @@ static int32_t ParseRpcidToJson(char *input, uint32_t inputLen, cJSON *rpcidJson char *sysCapBegin = input + sizeof(RPCIDHead) + sizeof(uint32_t); RPCIDHead *rpcidHeader = (RPCIDHead *)input; cJSON *sysCapJson = cJSON_CreateArray(); + if (sysCapJson == NULL) { + PRINT_ERR("Failed to create sysCapJson array\n"); + return -1; + } + for (i = 0; i < sysCapCount; i++) { char *temp = sysCapBegin + i * SINGLE_FEAT_LEN; if (strlen(temp) >= SINGLE_FEAT_LEN || strlen(temp) == 0) { @@ -263,6 +268,11 @@ int32_t RPCIDDecode(char *inputFile, char *outputPath) // save to json file convertedBuffer = cJSON_Print(rpcidRoot); + if (convertedBuffer == NULL) { + PRINT_ERR("cJSON_Print failed to create JSON string\n"); + goto FREE_RPCID_ROOT; + } + ret = ConvertedContextSaveAsFile(outputPath, "rpcid.json", convertedBuffer, strlen(convertedBuffer)); if (ret != 0) { PRINT_ERR("ConvertedContextSaveAsFile failed, outputPath:%s, filename:rpcid.json\n", outputPath); @@ -670,6 +680,31 @@ static int32_t CompareVersion(uint32_t *pcidOsArray, uint32_t *rpcidOsAarry) return versionFlag; } +static int32_t ReleaseRpcidPriSyscappcidAndPriSyscapMemory(int32_t ret, char *pcidContent, + char *rpcidContent, char *pcidPriSyscap, char *rpcidPriSyscap) +{ + if (ret != 0) { + PRINT_ERR("Separate syscap from string failed. ret = %d\n", ret); + } + + if (pcidContent == NULL) { + free(pcidContent); + } + + if (rpcidPriSyscap == NULL) { + free(rpcidPriSyscap); + } + + if (rpcidContent == NULL) { + free(rpcidContent); + } + + if (pcidPriSyscap == NULL) { + free(pcidPriSyscap); + } + return -1; +} + int32_t ComparePcidWithRpcidString(char *pcidFile, char *rpcidFile, uint32_t type) { int32_t ret; @@ -703,14 +738,7 @@ int32_t ComparePcidWithRpcidString(char *pcidFile, char *rpcidFile, uint32_t typ &pcidPriSyscap, &pcidPriSyscapLen); ret += SeparateSyscapFromString(rpcidContent, rpcidOsAarry, RPCID_OUT_BUFFER, &rpcidPriSyscap, &rpcidPriSyscapLen); - if (ret != 0) { - PRINT_ERR("Separate syscap from string failed. ret = %d\n", ret); - free(pcidContent); - free(rpcidContent); - free(pcidPriSyscap); - free(rpcidPriSyscap); - return -1; - } + ret = ReleaseRpcidPriSyscappcidAndPriSyscapMemory(ret, pcidContent, rpcidContent, pcidPriSyscap, rpcidPriSyscap); int32_t versionFlag = CompareVersion(pcidOsArray, rpcidOsAarry); int32_t ossyscapFlag = CompareOsSyscap(pcidOsArray, rpcidOsAarry); @@ -720,5 +748,13 @@ int32_t ComparePcidWithRpcidString(char *pcidFile, char *rpcidFile, uint32_t typ } else { printf("Fail! The pcid does not meet the rpcid\n"); } + + if (type != TYPE_STRING) { + PRINT_ERR("Release rpcidContent and pcidContent memory. ret = %d\n", ret); + free(pcidContent); + free(rpcidContent); + } + free(pcidPriSyscap); + free(rpcidPriSyscap); return 0; } \ No newline at end of file