diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 14082ca3537829bbcfa0be1c4b6c8bf062616c98..1d5c6189a77ba5744ba73fe2b0420121890cf374 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -14,6 +14,7 @@ */ #include +#include #include #include #include @@ -160,20 +161,19 @@ bool EncodePrivateSyscap(char **output, int *outputLen) return false; } - *outputLen = bufferLen - PCID_MAIN_BYTES - 1; - if (*outputLen == 0) { - *output = outputStr; - return true; + int priLen = bufferLen - PCID_MAIN_BYTES - 1; + if (priLen <= 0) { + *outputLen = 0; + return false; } - outputStr = (char *)malloc(*outputLen); + outputStr = (char *)calloc(priLen, sizeof(char)); if (outputStr == NULL) { - PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", *outputLen, errno); + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", priLen, errno); *outputLen = 0; return false; } - (void)memset_s(outputStr, *outputLen, 0, *outputLen); - ret = strncpy_s(outputStr, *outputLen, contextBuffer + PCID_MAIN_BYTES, *outputLen - 1); + ret = strncpy_s(outputStr, priLen, contextBuffer + PCID_MAIN_BYTES, priLen - 1); if (ret != 0) { PRINT_ERR("strcpy_s failed."); FreeContextBuffer(contextBuffer); @@ -183,6 +183,7 @@ bool EncodePrivateSyscap(char **output, int *outputLen) } FreeContextBuffer(contextBuffer); + *outputLen = strlen(outputStr); *output = outputStr; return true; } diff --git a/src/create_pcid.c b/src/create_pcid.c index 7926f933d6d1b4a5c5ef2f5ad2b11f285ea55868..ab48c8ba34499bed3f790b021e08ef5b281b8851 100644 --- a/src/create_pcid.c +++ b/src/create_pcid.c @@ -275,8 +275,8 @@ int32_t CreatePCID(char *inputFile, char *outDirPath) for (i = 0; i < privateCapSize; i++) { jsonArrayItem = cJSON_GetArrayItem(jsonPriSyscapObj, i); priSyscapStr = strchr(jsonArrayItem->valuestring, '.') + 1; - nRet = strcat_s(priSyscapHead, PRIVATE_SYSCAP_SIZE - 1, priSyscapStr); - nRet += strcat_s(priSyscapHead, PRIVATE_SYSCAP_SIZE - 1, ","); + nRet = strcat_s(priSyscapHead, allPriSyscapStrLen + 1, priSyscapStr); + nRet += strcat_s(priSyscapHead, allPriSyscapStrLen + 1, ","); if (nRet != EOK) { PRINT_ERR("strcat_s \"pri\" string is failed\n"); ret = -1; diff --git a/test/unittest/common/syscap_codec_test.cpp b/test/unittest/common/syscap_codec_test.cpp index bd388ea5e018335ab20561d0e21b4b88fed5b232..7b9a0eb533de525de9ae4d385212d8083aff311d 100644 --- a/test/unittest/common/syscap_codec_test.cpp +++ b/test/unittest/common/syscap_codec_test.cpp @@ -49,6 +49,9 @@ HWTEST_F(SyscapCodecTest, EncodePrivateSyscap, TestSize.Level1) char *charPriInput = nullptr; int priOutLen; EXPECT_TRUE(EncodePrivateSyscap(&charPriInput, &priOutLen)); + // Currently, private syscap is null. + EXPECT_EQ(*charPriInput, '\0'); + EXPECT_EQ(priOutLen, 0); free(charPriInput); } @@ -74,7 +77,7 @@ HWTEST_F(SyscapCodecTest, DecodeOsSyscap, TestSize.Level1) /* * @tc.name: DecodePrivateSyscap - * @tc.desc: Check the PrivateSyscap Decoding. + * @tc.desc: Check the null PrivateSyscap Decoding. * @tc.type: FUNC */ HWTEST_F(SyscapCodecTest, DecodePrivateSyscap, TestSize.Level1) @@ -134,8 +137,8 @@ HWTEST_F(SyscapCodecTest, ComparePcidString, TestSize.Level1) const char rpcidString[] = "33588992,1766370052,65536,276824064,0,0,0,0,0,0,"\ "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"\ "SystemCapability.vendor.xxxxx1,SystemCapability.device.xxxxx2"; - const char expect[][256] = {"SystemCapability.Graphic.Wms", - "SystemCapability.HiviewDFX.HiLog", + const char expect[][256] = {"SystemCapability.Graphic.UI", + "SystemCapability.HiviewDFX.HiDumper", "SystemCapability.vendor.xxxxx1", "SystemCapability.device.xxxxx2"}; int32_t ret = ComparePcidString(pcidString, rpcidString, &result);