From 4df89171f1354405e57c6f4c1d5f3cc91c6419a8 Mon Sep 17 00:00:00 2001 From: yudechen Date: Fri, 6 May 2022 15:30:02 +0800 Subject: [PATCH 1/7] for pcid dp. Signed-off-by: yudechen Change-Id: I1a89895bf5697ab999c2c417538a26522c1acf09 --- BUILD.gn | 12 ++++++++---- interfaces/inner_api/syscap_interface.c | 11 +++++------ interfaces/inner_api/syscap_interface.h | 4 ++-- napi/napi_query_syscap.cpp | 4 ++-- test/unittest/common/syscap_codec_test.cpp | 6 +++--- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index 5137892..f38e04b 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 c6dc419..fb99393 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,12 +84,12 @@ static uint32_t GetFileContext(char **contextBufPtr, uint32_t *bufferLen) return 0; } -bool EncodeOsSyscap(int **output) +bool EncodeOsSyscap(char **output) { int32_t ret; int32_t res; char *contextBuffer = NULL; - int *outputArray = NULL; + char *outputArray = NULL; uint32_t bufferLen; ret = GetFileContext(&contextBuffer, &bufferLen); @@ -99,7 +98,7 @@ bool EncodeOsSyscap(int **output) return false; } - outputArray = (int *)malloc(PCID_MAIN_LEN); + outputArray = (char *)malloc(PCID_MAIN_LEN); if (outputArray == NULL) { PRINT_ERR("malloc buffer failed, size = %d\n", PCID_MAIN_LEN); return false; @@ -152,13 +151,13 @@ 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; - 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++) { diff --git a/interfaces/inner_api/syscap_interface.h b/interfaces/inner_api/syscap_interface.h index a0b7610..c45895e 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); +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 71dc4a4..2a2face 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 = nullptr; errno_t err = EOK; uint32_t *osCapU32 = nullptr; char *priOutput = nullptr; @@ -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) { diff --git a/test/unittest/common/syscap_codec_test.cpp b/test/unittest/common/syscap_codec_test.cpp index f761abb..fe7eac1 100644 --- a/test/unittest/common/syscap_codec_test.cpp +++ b/test/unittest/common/syscap_codec_test.cpp @@ -34,9 +34,9 @@ void SyscapCodecTest::TearDown() {} */ HWTEST_F(SyscapCodecTest, EncodeOsSyscap, TestSize.Level1) { - int *intOsInput = NULL; - EXPECT_TRUE(EncodeOsSyscap(&intOsInput)); - free(intOsInput); + char *OsInput = NULL; + EXPECT_TRUE(EncodeOsSyscap(&OsInput)); + free(OsInput); } /* -- Gitee From d77a2eac0652c7d9ef6308b75c39fe3715c6c626 Mon Sep 17 00:00:00 2001 From: yudechen Date: Sat, 7 May 2022 09:48:44 +0800 Subject: [PATCH 2/7] change EncodeOsSyscap parameters. Signed-off-by: yudechen Change-Id: I227b6b09b38dc300063b3e55e2929bd051429407 --- interfaces/inner_api/syscap_interface.c | 14 ++------------ interfaces/inner_api/syscap_interface.h | 2 +- napi/napi_query_syscap.cpp | 4 ++-- test/unittest/common/include/syscap_codec_test.h | 3 --- test/unittest/common/syscap_codec_test.cpp | 9 +++++---- 5 files changed, 10 insertions(+), 22 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index fb99393..7ae550f 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -84,12 +84,11 @@ static uint32_t GetFileContext(char **contextBufPtr, uint32_t *bufferLen) return 0; } -bool EncodeOsSyscap(char **output) +bool EncodeOsSyscap(char output[128]) { int32_t ret; int32_t res; char *contextBuffer = NULL; - char *outputArray = NULL; uint32_t bufferLen; ret = GetFileContext(&contextBuffer, &bufferLen); @@ -98,23 +97,14 @@ bool EncodeOsSyscap(char **output) return false; } - outputArray = (char *)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; } diff --git a/interfaces/inner_api/syscap_interface.h b/interfaces/inner_api/syscap_interface.h index c45895e..1336887 100644 --- a/interfaces/inner_api/syscap_interface.h +++ b/interfaces/inner_api/syscap_interface.h @@ -25,7 +25,7 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -bool EncodeOsSyscap(char **output); +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 2a2face..a0ddae9 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; - char *osOutput = nullptr; + char osOutput[128] = {}; errno_t err = EOK; uint32_t *osCapU32 = nullptr; char *priOutput = nullptr; @@ -70,7 +70,7 @@ 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; diff --git a/test/unittest/common/include/syscap_codec_test.h b/test/unittest/common/include/syscap_codec_test.h index 61934ba..25c016c 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 fe7eac1..c8f39e1 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) { - char *OsInput = NULL; - EXPECT_TRUE(EncodeOsSyscap(&OsInput)); - free(OsInput); + 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"; -- Gitee From 1fabb01e4607d23e1e4e4fc65e907018491143c6 Mon Sep 17 00:00:00 2001 From: yudechen Date: Sat, 7 May 2022 14:11:39 +0800 Subject: [PATCH 3/7] Modify some details of DecodePrivateSyscap. Signed-off-by: yudechen Change-Id: I9b327402a342b8844c9449c3e5c42e56b17b4f22 --- interfaces/inner_api/syscap_interface.c | 38 +++++++++++++------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 7ae550f..7d6da19 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -192,48 +192,50 @@ bool DecodeOsSyscap(char input[128], char (**output)[128], int *outputCnt) 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 -- Gitee From ae4e0ae00d53b390f46df84a6299fcb8c72ede1c Mon Sep 17 00:00:00 2001 From: yudechen Date: Sat, 7 May 2022 14:45:58 +0800 Subject: [PATCH 4/7] modify some details of EncodePrivateSyscap. Signed-off-by: yudechen Change-Id: Ice0e16c5dac4242bd27fce7fc740eec232e90035 --- interfaces/inner_api/syscap_interface.c | 13 ++++++++----- src/create_pcid.c | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 7d6da19..95c0c8f 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -111,28 +111,31 @@ bool EncodeOsSyscap(char output[128]) 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; } diff --git a/src/create_pcid.c b/src/create_pcid.c index 388eaa6..dc7d1dc 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; } -- Gitee From a5606ea4cbc085aa702d5987b64f612f77951efe Mon Sep 17 00:00:00 2001 From: yudechen Date: Sat, 7 May 2022 16:48:14 +0800 Subject: [PATCH 5/7] modify DecodeOsSyscap. Signed-off-by: yudechen Change-Id: Ia25adcaa9ddccdfea20066a96fe4727cb854bccf --- interfaces/inner_api/syscap_interface.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 95c0c8f..e426386 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -147,8 +147,9 @@ bool EncodePrivateSyscap(char **output, int *outputLen) 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 + 8); // 8, int[2] of pcid header @@ -170,7 +171,7 @@ bool DecodeOsSyscap(char input[128], 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++) { @@ -180,6 +181,7 @@ bool DecodeOsSyscap(char input[128], char (**output)[128], int *outputCnt) printf("strcpy_s failed. error = %d\n", nRet); *outputCnt = 0; free(strSyscap); + strSyscap = NULL; return false; } strSyscap++; @@ -188,7 +190,6 @@ bool DecodeOsSyscap(char input[128], char (**output)[128], int *outputCnt) } } - *output = (char (*)[MAX_SYSCAP_STR_LEN])strSyscapBak; return true; } -- Gitee From 16fcafd6a615ff9175b8e5a5805a645b8bda52c8 Mon Sep 17 00:00:00 2001 From: yudechen Date: Mon, 9 May 2022 12:24:30 +0800 Subject: [PATCH 6/7] fix free problem. Signed-off-by: yudechen Change-Id: Icfa8086d93f0835141877df3edc118d6cb15bb8c --- napi/napi_query_syscap.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/napi/napi_query_syscap.cpp b/napi/napi_query_syscap.cpp index a0ddae9..bb403ff 100644 --- a/napi/napi_query_syscap.cpp +++ b/napi/napi_query_syscap.cpp @@ -73,7 +73,7 @@ static char* getSystemCapability() retBool = EncodeOsSyscap(osOutput); if (!retBool) { PRINT_ERR("get encoded os syscap failed."); - goto FREE_OSOUTPUT; + return nullptr; } retBool = EncodePrivateSyscap(&priOutput, &priOutputLen); if (!retBool) { @@ -146,9 +146,6 @@ FREE_PRICAP_ARRAY: free(priCapArray); FREE_PRIOUTPUT: free(priOutput); -FREE_OSOUTPUT: - free(osOutput); - temp = nullptr; return allSyscapBUffer; } -- Gitee From 03265ede5e9be02b2c7c07641e4369f238a48193 Mon Sep 17 00:00:00 2001 From: yudechen Date: Mon, 9 May 2022 17:39:14 +0800 Subject: [PATCH 7/7] modify error log print. Signed-off-by: yudechen Change-Id: I7ef3c446dd00d29a01d9406d23622af7d31b6447 --- interfaces/inner_api/syscap_interface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index e426386..d53dcc2 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -93,7 +93,7 @@ bool EncodeOsSyscap(char output[128]) 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; } @@ -163,7 +163,7 @@ bool DecodeOsSyscap(char input[128], 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; -- Gitee