From 59e83874f46dcfadf2d30bfd613a3681736ed9d3 Mon Sep 17 00:00:00 2001 From: yudechen Date: Mon, 15 Aug 2022 15:33:46 +0800 Subject: [PATCH] fix: EncodePrivateSyscap outputLen check. Change-Id: If099114c6137fffc181f66db2f868fe12083dfc8 Signed-off-by: yudechen --- interfaces/inner_api/syscap_interface.c | 24 +++++++++++----------- test/unittest/common/syscap_codec_test.cpp | 6 +++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 512b459..1d5c618 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,21 +161,19 @@ bool EncodePrivateSyscap(char **output, int *outputLen) return false; } - *outputLen = bufferLen - PCID_MAIN_BYTES - 1; - if (*outputLen == 0) { - *output = outputStr; - (*outputLen)--; - return true; - } - outputStr = (char *)malloc(*outputLen); - if (outputStr == NULL) { - PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", *outputLen, errno); + int priLen = bufferLen - PCID_MAIN_BYTES - 1; + if (priLen <= 0) { + *outputLen = 0; + return false; + } + outputStr = (char *)calloc(priLen, sizeof(char)); + if (outputStr == NULL) { + 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); @@ -184,6 +183,7 @@ bool EncodePrivateSyscap(char **output, int *outputLen) } FreeContextBuffer(contextBuffer); + *outputLen = strlen(outputStr); *output = outputStr; return true; } @@ -247,7 +247,7 @@ bool DecodePrivateSyscap(char *input, char (**output)[SINGLE_SYSCAP_LEN], int *o if (input == NULL) { *output = outputArray; *outputCnt = syscapCnt; - return true; + return false; } while (*inputPos != '\0') { diff --git a/test/unittest/common/syscap_codec_test.cpp b/test/unittest/common/syscap_codec_test.cpp index b2b2054..7b9a0eb 100644 --- a/test/unittest/common/syscap_codec_test.cpp +++ b/test/unittest/common/syscap_codec_test.cpp @@ -50,7 +50,7 @@ HWTEST_F(SyscapCodecTest, EncodePrivateSyscap, TestSize.Level1) int priOutLen; EXPECT_TRUE(EncodePrivateSyscap(&charPriInput, &priOutLen)); // Currently, private syscap is null. - EXPECT_EQ(charPriInput, nullptr); + EXPECT_EQ(*charPriInput, '\0'); EXPECT_EQ(priOutLen, 0); free(charPriInput); } @@ -137,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);