From 82058110c2e8335a97cd8c09d5e07d911b5e2528 Mon Sep 17 00:00:00 2001 From: lichao Date: Thu, 21 Dec 2023 17:32:43 +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 | 4 +- napi/napi_query_syscap.cpp | 37 +++++++------------ src/create_pcid.c | 49 ++++++++++++++++--------- src/syscap_tool.c | 4 +- 4 files changed, 49 insertions(+), 45 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 35b3bea..73e9cdd 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -510,7 +510,7 @@ static int32_t CopySyscopToRet(struct PcidPriSyscapInfo pcidPriSyscapInfo, const break; } } - pcidPriSyscapInfo.ret = strcpy_s(tempSyscap, sizeof(char) * SINGLE_SYSCAP_LEN, g_arraySyscap[t].str); + pcidPriSyscapInfo.ret = strcpy_s(tempSyscap, sizeof(char) * SINGLE_SYSCAP_LEN, g_arraySyscap[t].str); // 2, header of pcid & rpcid if (pcidPriSyscapInfo.ret != EOK) { return -1; @@ -542,7 +542,7 @@ static int32_t CheckPcidEachBit(struct PcidPriSyscapInfo pcidPriSyscapInfo, Comp return 0; } -static int32_t ComparePcidWithOsSyscap(struct PcidPriSyscapInfo pcidPriSyscapInfo, +static int32_t ComparePcidWithOsSyscap(struct PcidPriSyscapInfo pcidPriSyscapInfo, uint32_t pcidOsAarry[PCID_OUT_BUFFER], uint32_t rpcidOsAarry[PCID_OUT_BUFFER], CompareError *result, const size_t allSyscapNum) { diff --git a/napi/napi_query_syscap.cpp b/napi/napi_query_syscap.cpp index 774599d..f01836f 100644 --- a/napi/napi_query_syscap.cpp +++ b/napi/napi_query_syscap.cpp @@ -29,9 +29,6 @@ constexpr size_t PCID_MAIN_U32 = OS_SYSCAP_U32_NUM + 2; constexpr size_t U32_TO_STR_MAX_LEN = 11; constexpr size_t KEY_BUFFER_SIZE = 32; -#define FREE_PRICAP_ARRAY_AFTER_GET_SYS_CAP 1 -#define FREE_PRIOUTPUT_AFTER_GET_SYS_CAP 2 - #define GET_PARAMS(env, info, num) \ size_t argc = num; \ napi_value argv[num] = {0}; \ @@ -53,16 +50,15 @@ struct SystemCapabilityAsyncContext { int status = 0; }; -static char* CalculateAllStringLength(char *priOutput, char osCapArray[PCID_MAIN_U32][U32_TO_STR_MAX_LEN], - char (*priCapArray)[SINGLE_SYSCAP_LEN], char *allSyscapBuffer) +static char* CalculateAllStringLength(char osCapArray[PCID_MAIN_U32][U32_TO_STR_MAX_LEN], + char (*priCapArray)[SINGLE_SYSCAP_LEN], bool retBool, int priCapArrayCnt) { - bool retBool; errno_t err = EOK; char *temp = nullptr; - int retError, priCapArrayCnt; + int retError; int sumLen = 0; + char *allSyscapBuffer = nullptr; - retBool = DecodePrivateSyscap(priOutput, &priCapArray, &priCapArrayCnt); if (!retBool) { PRINT_ERR("get encoded private syscap failed."); return allSyscapBuffer; @@ -111,20 +107,10 @@ static char* CalculateAllStringLength(char *priOutput, char osCapArray[PCID_MAIN return allSyscapBuffer; } -static char* FreeAfterGetSysCap(char *priOutput, char (*priCapArray)[SINGLE_SYSCAP_LEN], char *allSyscapBuffer, - int32_t type) -{ - if (type == FREE_PRICAP_ARRAY_AFTER_GET_SYS_CAP) { - free(priCapArray); - } - free(priOutput); - return allSyscapBuffer; -} - static char* GetSystemCapability() { bool retBool; - int retError, priOutputLen; + int retError, priOutputLen, priCapArrayCnt; char osOutput[SINGLE_SYSCAP_LEN] = {}; uint32_t *osCapU32 = nullptr; @@ -142,7 +128,7 @@ static char* GetSystemCapability() retBool = EncodePrivateSyscap(&priOutput, &priOutputLen); if (!retBool) { PRINT_ERR("get encoded private syscap failed."); - return FreeAfterGetSysCap(priOutput, priCapArray, allSyscapBuffer, FREE_PRIOUTPUT_AFTER_GET_SYS_CAP); + goto FREE_PRIOUTPUT; } osCapU32 = reinterpret_cast(osOutput); @@ -150,12 +136,17 @@ static char* GetSystemCapability() retError = sprintf_s(osCapArray[i], U32_TO_STR_MAX_LEN, "%u", osCapU32[i]); if (retError == -1) { PRINT_ERR("get uint32_t syscap string failed."); - return FreeAfterGetSysCap(priOutput, priCapArray, allSyscapBuffer, FREE_PRIOUTPUT_AFTER_GET_SYS_CAP); + goto FREE_PRIOUTPUT; } } + retBool = DecodePrivateSyscap(priOutput, &priCapArray, &priCapArrayCnt); + allSyscapBuffer = CalculateAllStringLength(osCapArray, priCapArray, retBool, priCapArrayCnt); + free(priCapArray); - allSyscapBuffer = CalculateAllStringLength(priOutput, osCapArray, priCapArray, allSyscapBuffer); - return FreeAfterGetSysCap(priOutput, priCapArray, allSyscapBuffer, FREE_PRICAP_ARRAY_AFTER_GET_SYS_CAP); +FREE_PRIOUTPUT: + free(priOutput); + + return allSyscapBuffer; } napi_value QuerySystemCapability(napi_env env, napi_callback_info info) diff --git a/src/create_pcid.c b/src/create_pcid.c index f68bc15..92cf6bd 100644 --- a/src/create_pcid.c +++ b/src/create_pcid.c @@ -775,11 +775,36 @@ static int32_t GetEncodePCIDOut(uint16_t priSyscapCount, uint32_t privateSyscapL return FreeAfterEncodePCID(freePcidInfo, FREE_ENCODE_PCID_OUT, ret); } +static int32_t CheckPrivateSyCap(struct FreeEncodePcidInfo freePcidInfo, uint32_t privateSyscapLen, + char *privateSyscap, int32_t ret) +{ + uint32_t i, j; + char tempSyscap[SINGLE_SYSCAP_LEN] = {0}; + char *temp = tempSyscap; + for (i = 0, j = 0; i < privateSyscapLen; i++) { + if (*privateSyscap == ',') { + *temp = '\0'; + ret = sprintf_s(freePcidInfo.priSyscapFull + j * SINGLE_SYSCAP_LEN, SINGLE_SYSCAP_LEN, + "SystemCapability.%s", tempSyscap); + if (ret == -1) { + PRINT_ERR("sprintf_s failed\n"); + return ret; + } + temp = tempSyscap; + privateSyscap++; + j++; + continue; + } + *temp++ = *privateSyscap++; + } + return ret; +} + int32_t EncodePcidscToString(char *inputFile, char *outDirPath) { int32_t ret = 0; uint32_t bufferLen, privateSyscapLen; - uint32_t i, j; + uint32_t i; uint32_t *mainSyscap = NULL; uint16_t priSyscapCount = 0; @@ -825,24 +850,12 @@ int32_t EncodePcidscToString(char *inputFile, char *outDirPath) } (void)memset_s(freePcidInfo.priSyscapFull, priSyscapCount * SINGLE_SYSCAP_LEN, 0, priSyscapCount * SINGLE_SYSCAP_LEN); - char tempSyscap[SINGLE_SYSCAP_LEN] = {0}; - char *temp = tempSyscap; - for (i = 0, j = 0; i < privateSyscapLen; i++) { - if (*privateSyscap == ',') { - *temp = '\0'; - ret = sprintf_s(freePcidInfo.priSyscapFull + j * SINGLE_SYSCAP_LEN, SINGLE_SYSCAP_LEN, - "SystemCapability.%s", tempSyscap); - if (ret == -1) { - PRINT_ERR("sprintf_s failed\n"); - return FreeAfterEncodePCID(freePcidInfo, FREE_ENCODE_PCID_PRISYSCAP_FULL_OUT, ret); - } - temp = tempSyscap; - privateSyscap++; - j++; - continue; - } - *temp++ = *privateSyscap++; + + ret = CheckPrivateSyCap(freePcidInfo, privateSyscapLen, privateSyscap, ret); + if (ret == -1) { + return FreeAfterEncodePCID(freePcidInfo, FREE_ENCODE_PCID_PRISYSCAP_FULL_OUT, ret); } + // output return GetEncodePCIDOut(priSyscapCount, privateSyscapLen, mainSyscap, freePcidInfo, ret); } \ No newline at end of file diff --git a/src/syscap_tool.c b/src/syscap_tool.c index 7db704a..1bc98ea 100644 --- a/src/syscap_tool.c +++ b/src/syscap_tool.c @@ -54,7 +54,7 @@ #define FREE_RPCID_ROOT_AFTER_RPCIDSC 5 #define FREE_CONTEXT_OUT_AFTER_RPCIDSC 6 -struct JsonObjectSysCap{ +struct JsonObjectSysCap { cJSON *cjsonObjectRoot; cJSON *sysCapPtr; }; @@ -373,7 +373,7 @@ static int32_t OutputSetMemAndPrintToFile(struct FreeAfterEncodeRpcidscInfo free outUint[1] = *(uint32_t *)(freeAfterEncodeRpcidscInfo.contextBuffer + sizeof(uint32_t)); uint8_t *osOutUint = (uint8_t *)(outUint + 2); // 120, len of osOutUint - if (SetOsSysCapBitMap(osOutUint, 120, freeAfterEncodeRpcidscInfo.osSysCapIndex, indexOs) != 0) { + if (SetOsSysCapBitMap(osOutUint, 120, freeAfterEncodeRpcidscInfo.osSysCapIndex, indexOs) != 0) { PRINT_ERR("Set os syscap bit map failed.\n"); freeAfterEncodeRpcidscInfo.flag = 1; return ret;