diff --git a/BUILD.gn b/BUILD.gn index 5137892902317271e906c86e0b0a7d6497caa6c5..f38e04bbecd5704d82baf33786eb60b08e6ced84 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -94,10 +94,14 @@ ohos_shared_library("syscap_tool_shared") { part_name = "syscap_codec" } +config("syscap_interface_public_config") { + include_dirs = [ "./interfaces/inner_api/" ] +} + if (defined(ohos_lite)) { shared_library("syscap_interface_shared") { - include_dirs = [ "./interfaces/inner_api/" ] - public_configs = [ ":pubilc" ] + include_dirs = [ "include" ] + public_configs = [ ":syscap_interface_public_config" ] sources = [ "./interfaces/inner_api/syscap_interface.c" ] deps = [ @@ -107,8 +111,8 @@ if (defined(ohos_lite)) { } } else { ohos_shared_library("syscap_interface_shared") { - include_dirs = [ "./interfaces/inner_api/" ] - public_configs = [ ":pubilc" ] + include_dirs = [ "include" ] + public_configs = [ ":syscap_interface_public_config" ] sources = [ "./interfaces/inner_api/syscap_interface.c" ] deps = [ diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index c6dc419742614ef7ce2261c0a427d9c9345e3d1c..d53dcc2c8d3ec66cb8f64d00476bd2fb666c1652 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -21,7 +21,6 @@ #include #include #include -#include "create_pcid.h" #include "syscap_define.h" #include "syscap_interface.h" @@ -85,65 +84,58 @@ static uint32_t GetFileContext(char **contextBufPtr, uint32_t *bufferLen) return 0; } -bool EncodeOsSyscap(int **output) +bool EncodeOsSyscap(char output[128]) { int32_t ret; int32_t res; char *contextBuffer = NULL; - int *outputArray = NULL; uint32_t bufferLen; ret = GetFileContext(&contextBuffer, &bufferLen); if (ret != 0) { - PRINT_ERR("GetFileContext failed, input file : rk3568.sc\n"); + PRINT_ERR("GetFileContext failed, input file : /system/etc/PCID.sc\n"); return false; } - outputArray = (int *)malloc(PCID_MAIN_LEN); - if (outputArray == NULL) { - PRINT_ERR("malloc buffer failed, size = %d\n", PCID_MAIN_LEN); - return false; - } - (void)memset_s(outputArray, PCID_MAIN_LEN, 0, PCID_MAIN_LEN); - - res = memcpy_s(outputArray, PCID_MAIN_LEN, contextBuffer, PCID_MAIN_LEN); + res = memcpy_s(output, PCID_MAIN_LEN, contextBuffer, PCID_MAIN_LEN); if (res != 0) { PRINT_ERR("memcpy_s failed."); FreeContextBuffer(contextBuffer); - free(outputArray); return false; } FreeContextBuffer(contextBuffer); - *output = outputArray; return true; } bool EncodePrivateSyscap(char **output, int *outputLen) { int32_t ret; - int32_t res; char *contextBuffer = NULL; char *outputStr = NULL; uint32_t bufferLen; ret = GetFileContext(&contextBuffer, &bufferLen); if (ret != 0) { - PRINT_ERR("GetFileContext failed, input file : rk3568.sc\n"); + PRINT_ERR("GetFileContext failed, input file : /system/etc/PCID.sc\n"); return false; } - *outputLen = bufferLen - MAX_SYSCAP_STR_LEN - 1; + *outputLen = bufferLen - PCID_MAIN_LEN - 1; outputStr = (char *)malloc(*outputLen); if (outputStr == NULL) { PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", *outputLen, errno); + *outputLen = 0; return false; } (void)memset_s(outputStr, *outputLen, 0, *outputLen); - res = strncpy_s(outputStr, *outputLen + 1, contextBuffer + MAX_SYSCAP_STR_LEN, *outputLen); - if (res != 0) { + + ret = strncpy_s(outputStr, *outputLen, contextBuffer + PCID_MAIN_LEN, *outputLen); + if (ret != 0) { PRINT_ERR("strcpy_s failed."); FreeContextBuffer(contextBuffer); + free(outputStr); + *outputLen = 0; return false; } @@ -152,13 +144,14 @@ bool EncodePrivateSyscap(char **output, int *outputLen) return true; } -bool DecodeOsSyscap(int input[32], char (**output)[128], int *outputCnt) +bool DecodeOsSyscap(char input[128], char (**output)[128], int *outputCnt) { errno_t nRet = 0; - uint16_t indexOfSyscap[OS_SYSCAP_BYTES * OS_SYSCAP_BYTES] = {0}; - int countOfSyscap = 0, i, j; + uint16_t indexOfSyscap[BITS_OF_BYTE * OS_SYSCAP_BYTES] = {0}; + uint16_t countOfSyscap = 0; + uint16_t i, j; - uint8_t *osSyscap = (uint8_t *)(input + 2); // 2, int[2] of pcid header + uint8_t *osSyscap = (uint8_t *)(input + 8); // 8, int[2] of pcid header for (i = 0; i < OS_SYSCAP_BYTES; i++) { for (j = 0; j < BITS_OF_BYTE; j++) { @@ -170,7 +163,7 @@ bool DecodeOsSyscap(int input[32], char (**output)[128], int *outputCnt) *outputCnt = countOfSyscap; char (*strSyscap)[MAX_SYSCAP_STR_LEN] = NULL; - strSyscap= (char (*)[MAX_SYSCAP_STR_LEN])malloc(countOfSyscap * MAX_SYSCAP_STR_LEN); + strSyscap = (char (*)[MAX_SYSCAP_STR_LEN])malloc(countOfSyscap * MAX_SYSCAP_STR_LEN); if (strSyscap == NULL) { PRINT_ERR("malloc failed."); *outputCnt = 0; @@ -178,7 +171,7 @@ bool DecodeOsSyscap(int input[32], char (**output)[128], int *outputCnt) } (void)memset_s(strSyscap, countOfSyscap * MAX_SYSCAP_STR_LEN, \ 0, countOfSyscap * MAX_SYSCAP_STR_LEN); - char **strSyscapBak = (char **)strSyscap; + *output = strSyscap; for (i = 0; i < countOfSyscap; i++) { for (j = 0; j < sizeof(arraySyscap) / sizeof(SyscapWithNum); j++) { @@ -188,6 +181,7 @@ bool DecodeOsSyscap(int input[32], char (**output)[128], int *outputCnt) printf("strcpy_s failed. error = %d\n", nRet); *outputCnt = 0; free(strSyscap); + strSyscap = NULL; return false; } strSyscap++; @@ -196,55 +190,56 @@ bool DecodeOsSyscap(int input[32], char (**output)[128], int *outputCnt) } } - *output = (char (*)[MAX_SYSCAP_STR_LEN])strSyscapBak; return true; } bool DecodePrivateSyscap(char *input, char (**output)[128], int *outputCnt) { char (*outputArray)[MAX_SYSCAP_STR_LEN] = NULL; - char *inputStr = input; + char *inputPos = input; uint16_t bufferLen; - int syscapCnt = 0, ret; + int ret; + int syscapCnt = 0; - while (*inputStr != '\0') { - if (*inputStr == ',') { + while (*inputPos != '\0') { + if (*inputPos == ',') { syscapCnt++; } - inputStr++; + inputPos++; } - inputStr = input; + inputPos = input; bufferLen = MAX_SYSCAP_STR_LEN * syscapCnt; outputArray = (char (*)[MAX_SYSCAP_STR_LEN])malloc(bufferLen); if (outputArray == NULL) { PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", bufferLen, errno); - syscapCnt = 0; + *outputCnt = 0; return false; } (void)memset_s(outputArray, bufferLen, 0, bufferLen); - char **outputArrayBak = (char **)outputArray; - char priSyscapStr[MAX_SYSCAP_STR_LEN - 17] = {0}; // 17. size of "SystemCapability." - char *tempPriSyscapStr = priSyscapStr; - while (*inputStr != '\0') { - if (*inputStr == ',') { - *tempPriSyscapStr = '\0'; - ret = sprintf_s(*outputArray, MAX_SYSCAP_STR_LEN, "SystemCapability.%s", priSyscapStr); + + *output = outputArray; + char buffer[MAX_SYSCAP_STR_LEN - 17] = {0}; // 17. size of "SystemCapability." + char *bufferPos = buffer; + while (*inputPos != '\0') { + if (*inputPos == ',') { + *bufferPos = '\0'; + ret = sprintf_s(*outputArray, MAX_SYSCAP_STR_LEN, "SystemCapability.%s", buffer); if (ret == -1) { PRINT_ERR("sprintf_s failed\n"); *outputCnt = 0; free(outputArray); + outputArray = NULL; return false; } - tempPriSyscapStr = priSyscapStr; + bufferPos = buffer; outputArray++; - inputStr++; + inputPos++; continue; } - *tempPriSyscapStr++ = *inputStr++; + *bufferPos++ = *inputPos++; } *outputCnt = syscapCnt; - *output = (char (*)[MAX_SYSCAP_STR_LEN])outputArrayBak; return true; } \ No newline at end of file diff --git a/interfaces/inner_api/syscap_interface.h b/interfaces/inner_api/syscap_interface.h index a0b7610d4839de39ec5f4b5cbf6a9d88aac20ee4..1336887f09e4c1b004066cdefb759ff979bba99b 100644 --- a/interfaces/inner_api/syscap_interface.h +++ b/interfaces/inner_api/syscap_interface.h @@ -25,8 +25,8 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -bool EncodeOsSyscap(int **output); -bool DecodeOsSyscap(int input[32], char (**output)[128], int *outputCnt); +bool EncodeOsSyscap(char output[128]); +bool DecodeOsSyscap(char input[128], char (**output)[128], int *outputCnt); bool EncodePrivateSyscap(char **output, int *outputLen); bool DecodePrivateSyscap(char *input, char (**output)[128], int *outputCnt); diff --git a/napi/napi_query_syscap.cpp b/napi/napi_query_syscap.cpp index 71dc4a4b9639e8122af3e9c500e51b28e11033dd..bb403ffbf6eab6e518456d74e439439f667653c8 100644 --- a/napi/napi_query_syscap.cpp +++ b/napi/napi_query_syscap.cpp @@ -61,7 +61,7 @@ static char* getSystemCapability() bool retBool; int retError, priOutputLen, priCapArrayCnt, sumLen; int i = 0; - int *osOutput = nullptr; + char osOutput[128] = {}; errno_t err = EOK; uint32_t *osCapU32 = nullptr; char *priOutput = nullptr; @@ -70,10 +70,10 @@ static char* getSystemCapability() char osCapArray[OS_SYSCAP_U32_NUM][U32_TO_STR_MAX_LEN] = {}; char (*priCapArray)[SYSCAP_STR_MAX_LEN] = nullptr; - retBool = EncodeOsSyscap(&osOutput); + retBool = EncodeOsSyscap(osOutput); if (!retBool) { PRINT_ERR("get encoded os syscap failed."); - goto FREE_OSOUTPUT; + return nullptr; } retBool = EncodePrivateSyscap(&priOutput, &priOutputLen); if (!retBool) { @@ -81,7 +81,7 @@ static char* getSystemCapability() goto FREE_PRIOUTPUT; } - osCapU32 = reinterpret_cast(osOutput + 2); // 2, header of pcid.sc + osCapU32 = reinterpret_cast(osOutput + 8); // 8, header of pcid.sc for (i = 0; i < OS_SYSCAP_U32_NUM; i++) { retError = sprintf_s(osCapArray[i], U32_TO_STR_MAX_LEN, "%u", osCapU32[i]); if (retError == -1) { @@ -146,9 +146,6 @@ FREE_PRICAP_ARRAY: free(priCapArray); FREE_PRIOUTPUT: free(priOutput); -FREE_OSOUTPUT: - free(osOutput); - temp = nullptr; return allSyscapBUffer; } diff --git a/src/create_pcid.c b/src/create_pcid.c index 388eaa6908211eab05f9c1962c8e384284a34b10..dc7d1dc46b24e1841ec8ca478e4bdb0529a332f0 100644 --- a/src/create_pcid.c +++ b/src/create_pcid.c @@ -209,7 +209,7 @@ int32_t CreatePCID(char *inputFile, char *outDirPath) allPriSyscapStrLen++; // for separator ',' } if ((allPriSyscapStrLen + 1) > PRIVATE_SYSCAP_SIZE) { - PRINT_ERR("context of \"pri\" array is too many\n"); + PRINT_ERR("context of \"pri\" array is too many.\n"); ret = -1; goto FREE_CONVERT_OUT; } diff --git a/test/unittest/common/include/syscap_codec_test.h b/test/unittest/common/include/syscap_codec_test.h index 61934ba8bff6259e0a814134dc74dd458df5c3aa..25c016c082680e5f10b048d966b6ff45674eff48 100644 --- a/test/unittest/common/include/syscap_codec_test.h +++ b/test/unittest/common/include/syscap_codec_test.h @@ -26,9 +26,6 @@ extern "C" { #endif /* __cplusplus */ namespace Syscap { -int osSyscap[32] = {1, 3, 3}; -char priSyscap[] = "Device.syscap1GEDR,Device.syscap2WREGW,Vendor.syscap3RGD,Vendor.syscap4RWEG,Vendor.syscap5REWGWE,"; - class SyscapCodecTest : public testing::Test { public: static void SetUpTestCase(void); diff --git a/test/unittest/common/syscap_codec_test.cpp b/test/unittest/common/syscap_codec_test.cpp index f761abbf96cbebf23d8bd13bd3a13b682e305972..c8f39e1c2917d89cba55be80aeb3fbd9b23b0b02 100644 --- a/test/unittest/common/syscap_codec_test.cpp +++ b/test/unittest/common/syscap_codec_test.cpp @@ -34,9 +34,8 @@ void SyscapCodecTest::TearDown() {} */ HWTEST_F(SyscapCodecTest, EncodeOsSyscap, TestSize.Level1) { - int *intOsInput = NULL; - EXPECT_TRUE(EncodeOsSyscap(&intOsInput)); - free(intOsInput); + char OsInput[128] = {0}; + EXPECT_TRUE(EncodeOsSyscap(OsInput)); } /* @@ -59,11 +58,12 @@ HWTEST_F(SyscapCodecTest, EncodePrivateSyscap, TestSize.Level1) */ HWTEST_F(SyscapCodecTest, DecodeOsSyscap, TestSize.Level1) { + int osSyscap[32] = {1, 3, 3}; char (*osOutput)[128] = NULL; int decodeOsCnt; char expectOsOutput001[] = "SystemCapability.Account.AppAccount"; char expectOsOutput002[] = "SystemCapability.Account.OsAccount"; - EXPECT_TRUE(DecodeOsSyscap(osSyscap, &osOutput, &decodeOsCnt)); + EXPECT_TRUE(DecodeOsSyscap((char *)osSyscap, &osOutput, &decodeOsCnt)); char (*tmpOsOutput)[128] = osOutput; EXPECT_STREQ(*tmpOsOutput, expectOsOutput001); EXPECT_STREQ(*(tmpOsOutput + 1), expectOsOutput002); @@ -79,6 +79,7 @@ HWTEST_F(SyscapCodecTest, DecodeOsSyscap, TestSize.Level1) HWTEST_F(SyscapCodecTest, DecodePrivateSyscap, TestSize.Level1) { char (*priOutput)[128] = NULL; + char priSyscap[] = "Device.syscap1GEDR,Device.syscap2WREGW,Vendor.syscap3RGD,Vendor.syscap4RWEG,Vendor.syscap5REWGWE,"; int decodePriCnt; char expectPriOutput001[] = "SystemCapability.Device.syscap1GEDR"; char expectPriOutput002[] = "SystemCapability.Device.syscap2WREGW";