!626 merge master into master

fix: 解决interfaces\inner_api\syscap_interface.c内存泄漏问题

Created-by: cuican86
Commit-by: cuican
Merged-by: openharmony_ci
Description: ### 一、内容说明(相关的Issue)


https://gitcode.com/openharmony/developtools_syscap_codec/issues/351
### 二、建议测试周期和提测地址  
  建议测试完成时间:xxxx.xx.xx  
  投产上线时间:xxxx.xx.xx  
  提测地址:CI环境/压测环境  
  测试账号:  

### 三、变更内容
  * 3.1 关联PR列表

  * 3.2 数据库和部署说明  
    1. 常规更新 
    2. 重启unicorn
    3. 重启sidekiq
    4. 迁移任务:是否有迁移任务,没有写 "无"
    5. rake脚本:`bundle exec xxx RAILS_ENV = production`;没有写 "无"

  * 3.4 其他技术优化内容(做了什么,变更了什么)
    - 重构了 xxxx 代码
    - xxxx 算法优化


  * 3.5 废弃通知(什么字段、方法弃用?)



  * 3.6  后向不兼容变更(是否有无法向后兼容的变更?)


  
### 四、研发自测点(自测哪些?冒烟用例全部自测?)
  自测测试结论:
  修复后无cppcheck扫描出的内存泄漏问题
![修复前.png](https://raw.gitcode.com/user-images/assets/4384639/fa49d89c-3efd-408a-8a53-8d00ef6630fd/修复前.png '修复前.png')
![修复后无该问题扫描.png](https://raw.gitcode.com/user-images/assets/4384639/0f9ae2cf-9c6d-4af5-a6d6-bd8362e6ce6f/修复后无该问题扫描.png '修复后无该问题扫描.png')

TDD用例测试结果ok
![TDD用例验证.png](https://raw.gitcode.com/user-images/assets/4384639/f5cf7f2d-7c9e-4158-85f4-5a4b0412633a/TDD用例验证.png 'TDD用例验证.png')
### 五、测试关注点(需要提醒QA重点关注的、可能会忽略的地方)
  检查点:

| 需求名称 | 是否影响xx公共模块 | 是否需要xx功能 | 需求升级是否依赖其他子产品 |
|------|------------|----------|---------------|
| xxx  | 否          | 需要       | 不需要           |
|      |            |          |               |

  接口测试:

  性能测试:

  并发测试:

  其他:



See merge request: openharmony/developtools_syscap_codec!626
This commit is contained in:
openharmony_ci
2026-02-26 11:03:41 +08:00
+44 -44
View File
@@ -334,40 +334,40 @@ FREE_SYSCAP_OUT:
return ret;
}
static int32_t TransStringFormatAndSaveSyscap(struct FreeAfterDecodeRpcidInfo freeAfterDecodeRpcidInfo,
static int32_t TransStringFormatAndSaveSyscap(struct FreeAfterDecodeRpcidInfo *freeAfterDecodeRpcidInfo,
cJSON *sysCapArray, const char *inputFile)
{
// trans to string format
sysCapArray = cJSON_GetObjectItem(freeAfterDecodeRpcidInfo.rpcidRoot, "syscap");
sysCapArray = cJSON_GetObjectItem(freeAfterDecodeRpcidInfo->rpcidRoot, "syscap");
if (sysCapArray == NULL || !cJSON_IsArray(sysCapArray)) {
PRINT_ERR("Get syscap failed. Input file: %s\n", inputFile);
return -1;
}
freeAfterDecodeRpcidInfo.sysCapArraySize = cJSON_GetArraySize(sysCapArray);
if (freeAfterDecodeRpcidInfo.sysCapArraySize < 0) {
freeAfterDecodeRpcidInfo->sysCapArraySize = cJSON_GetArraySize(sysCapArray);
if (freeAfterDecodeRpcidInfo->sysCapArraySize < 0) {
PRINT_ERR("Get syscap size failed. Input file: %s\n", inputFile);
return -1;
}
// malloc for save os syscap index
freeAfterDecodeRpcidInfo.osSysCapIndex = (uint16_t *)malloc(sizeof(uint16_t)
* freeAfterDecodeRpcidInfo.sysCapArraySize);
if (freeAfterDecodeRpcidInfo.osSysCapIndex == NULL) {
freeAfterDecodeRpcidInfo->osSysCapIndex = (uint16_t *)malloc(sizeof(uint16_t) *
freeAfterDecodeRpcidInfo->sysCapArraySize);
if (freeAfterDecodeRpcidInfo->osSysCapIndex == NULL) {
PRINT_ERR("malloc failed.\n");
return -1;
}
return 0;
}
static void PrintResultToOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDecodeRpcidInfo, char *outBuffer,
static void PrintResultToOutBuffer(struct FreeAfterDecodeRpcidInfo *freeAfterDecodeRpcidInfo, char *outBuffer,
char *priSyscapArray, uint16_t indexOs, uint16_t indexPri)
{
int32_t ret = 0;
uint32_t i;
uint32_t outUint[RPCID_OUT_BUFFER] = {0};
outUint[0] = *(uint32_t *)freeAfterDecodeRpcidInfo.contextBuffer;
outUint[1] = *(uint32_t *)(freeAfterDecodeRpcidInfo.contextBuffer + sizeof(uint32_t));
outUint[0] = *(uint32_t *)freeAfterDecodeRpcidInfo->contextBuffer;
outUint[1] = *(uint32_t *)(freeAfterDecodeRpcidInfo->contextBuffer + sizeof(uint32_t));
uint8_t *osOutUint = (uint8_t *)(outUint + 2);
if (SetOsSysCapBitMap(osOutUint, 120, freeAfterDecodeRpcidInfo.osSysCapIndex, indexOs)) { // 120, len of osOutUint
if (SetOsSysCapBitMap(osOutUint, 120, freeAfterDecodeRpcidInfo->osSysCapIndex, indexOs)) { // 120, len of osOutUint
PRINT_ERR("Set os syscap bit map failed.\n");
return;
}
@@ -405,7 +405,7 @@ static void PrintResultToOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDeco
}
}
static void PartSysCapAndOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDecodeRpcidInfo, char *outBuffer,
static void PartSysCapAndOutBuffer(struct FreeAfterDecodeRpcidInfo *freeAfterDecodeRpcidInfo, char *outBuffer,
char *priSyscapArray, cJSON *sysCapArray)
{
uint32_t i;
@@ -414,23 +414,23 @@ static void PartSysCapAndOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDeco
uint16_t indexPri = 0;
cJSON *cJsonTemp = NULL;
freeAfterDecodeRpcidInfo.sysCapDefine = CreateWholeSyscapJsonObj();
(void)memset_s(priSyscapArray, freeAfterDecodeRpcidInfo.sysCapArraySize * SINGLE_SYSCAP_LEN,
0, freeAfterDecodeRpcidInfo.sysCapArraySize * SINGLE_SYSCAP_LEN);
freeAfterDecodeRpcidInfo.priSyscap = priSyscapArray;
freeAfterDecodeRpcidInfo->sysCapDefine = CreateWholeSyscapJsonObj();
(void)memset_s(priSyscapArray, freeAfterDecodeRpcidInfo->sysCapArraySize * SINGLE_SYSCAP_LEN,
0, freeAfterDecodeRpcidInfo->sysCapArraySize * SINGLE_SYSCAP_LEN);
freeAfterDecodeRpcidInfo->priSyscap = priSyscapArray;
// part os syscap and ptivate syscap
for (i = 0; i < (uint32_t)freeAfterDecodeRpcidInfo.sysCapArraySize; i++) {
for (i = 0; i < (uint32_t)freeAfterDecodeRpcidInfo->sysCapArraySize; i++) {
cJSON *cJsonItem = cJSON_GetArrayItem(sysCapArray, i);
if (cJsonItem->valuestring == NULL) {
cJSON_Delete(cJsonItem);
return;
}
cJsonTemp = cJSON_GetObjectItem(freeAfterDecodeRpcidInfo.sysCapDefine, cJsonItem->valuestring);
cJsonTemp = cJSON_GetObjectItem(freeAfterDecodeRpcidInfo->sysCapDefine, cJsonItem->valuestring);
if (cJsonTemp != NULL && cJSON_IsNumber(cJsonTemp)) {
freeAfterDecodeRpcidInfo.osSysCapIndex[indexOs++] = (uint16_t)(cJsonTemp->valueint);
freeAfterDecodeRpcidInfo->osSysCapIndex[indexOs++] = (uint16_t)(cJsonTemp->valueint);
} else {
ret = strcpy_s(freeAfterDecodeRpcidInfo.priSyscap, SINGLE_SYSCAP_LEN, cJsonItem->valuestring);
ret = strcpy_s(freeAfterDecodeRpcidInfo->priSyscap, SINGLE_SYSCAP_LEN, cJsonItem->valuestring);
if (ret != EOK) {
PRINT_ERR("strcpy_s failed.\n");
return;
@@ -442,35 +442,35 @@ static void PartSysCapAndOutBuffer(struct FreeAfterDecodeRpcidInfo freeAfterDeco
PrintResultToOutBuffer(freeAfterDecodeRpcidInfo, outBuffer, priSyscapArray, indexOs, indexPri);
}
static char *FreeAfterDecodeRpcidToString(struct FreeAfterDecodeRpcidInfo freeAfterDecodeRpcidInfo, int32_t type,
static char *FreeAfterDecodeRpcidToString(struct FreeAfterDecodeRpcidInfo *freeAfterDecodeRpcidInfo, int32_t type,
char *outBuffer)
{
switch (type) {
case FREE_MALLOC_PRISYSCAP_AFTER_DECODE_RPCID:
SafeFree(freeAfterDecodeRpcidInfo.priSyscap);
free(freeAfterDecodeRpcidInfo.osSysCapIndex);
cJSON_Delete(freeAfterDecodeRpcidInfo.sysCapDefine);
cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot);
FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer);
SafeFree(freeAfterDecodeRpcidInfo->priSyscap);
free(freeAfterDecodeRpcidInfo->osSysCapIndex);
cJSON_Delete(freeAfterDecodeRpcidInfo->sysCapDefine);
cJSON_Delete(freeAfterDecodeRpcidInfo->rpcidRoot);
FreeContextBuffer(freeAfterDecodeRpcidInfo->contextBuffer);
break;
case FREE_MALLOC_OSSYSCAP_AFTER_DECODE_RPCID:
free(freeAfterDecodeRpcidInfo.osSysCapIndex);
cJSON_Delete(freeAfterDecodeRpcidInfo.sysCapDefine);
cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot);
FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer);
free(freeAfterDecodeRpcidInfo->osSysCapIndex);
cJSON_Delete(freeAfterDecodeRpcidInfo->sysCapDefine);
cJSON_Delete(freeAfterDecodeRpcidInfo->rpcidRoot);
FreeContextBuffer(freeAfterDecodeRpcidInfo->contextBuffer);
break;
case FREE_WHOLE_SYSCAP_AFTER_DECODE_RPCID:
cJSON_Delete(freeAfterDecodeRpcidInfo.sysCapDefine);
cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot);
FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer);
cJSON_Delete(freeAfterDecodeRpcidInfo->sysCapDefine);
cJSON_Delete(freeAfterDecodeRpcidInfo->rpcidRoot);
FreeContextBuffer(freeAfterDecodeRpcidInfo->contextBuffer);
break;
case FREE_RPCID_ROOT_AFTER_DECODE_RPCID:
cJSON_Delete(freeAfterDecodeRpcidInfo.rpcidRoot);
FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer);
cJSON_Delete(freeAfterDecodeRpcidInfo->rpcidRoot);
FreeContextBuffer(freeAfterDecodeRpcidInfo->contextBuffer);
break;
case FREE_CONTEXT_OUT_AFTER_DECODE_RPCID:
default:
FreeContextBuffer(freeAfterDecodeRpcidInfo.contextBuffer);
FreeContextBuffer(freeAfterDecodeRpcidInfo->contextBuffer);
}
return outBuffer;
}
@@ -494,23 +494,23 @@ char *DecodeRpcidToStringFormat(const char *inputFile)
// check rpcid.sc
if (CheckRpcidFormat(inputFile, &freeAfterDecodeRpcidInfo.contextBuffer, &bufferLen)) {
PRINT_ERR("Check rpcid.sc format failed. Input file: %s\n", inputFile);
return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_CONTEXT_OUT_AFTER_DECODE_RPCID, outBuffer);
return FreeAfterDecodeRpcidToString(&freeAfterDecodeRpcidInfo, FREE_CONTEXT_OUT_AFTER_DECODE_RPCID, outBuffer);
}
// parse rpcid to json
freeAfterDecodeRpcidInfo.rpcidRoot = cJSON_CreateObject();
if (freeAfterDecodeRpcidInfo.rpcidRoot == NULL) {
PRINT_ERR("Failed to create cJSON object for rpcidRoot\n");
return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_CONTEXT_OUT_AFTER_DECODE_RPCID, outBuffer);
return FreeAfterDecodeRpcidToString(&freeAfterDecodeRpcidInfo, FREE_CONTEXT_OUT_AFTER_DECODE_RPCID, outBuffer);
}
if (ParseRpcidToJson(freeAfterDecodeRpcidInfo.contextBuffer, bufferLen, freeAfterDecodeRpcidInfo.rpcidRoot)) {
PRINT_ERR("Prase rpcid to json failed. Input file: %s\n", inputFile);
return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_RPCID_ROOT_AFTER_DECODE_RPCID, outBuffer);
return FreeAfterDecodeRpcidToString(&freeAfterDecodeRpcidInfo, FREE_RPCID_ROOT_AFTER_DECODE_RPCID, outBuffer);
}
ret = TransStringFormatAndSaveSyscap(freeAfterDecodeRpcidInfo, sysCapArray, inputFile);
ret = TransStringFormatAndSaveSyscap(&freeAfterDecodeRpcidInfo, sysCapArray, inputFile);
if (ret == -1) {
return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_WHOLE_SYSCAP_AFTER_DECODE_RPCID, outBuffer);
return FreeAfterDecodeRpcidToString(&freeAfterDecodeRpcidInfo, FREE_WHOLE_SYSCAP_AFTER_DECODE_RPCID, outBuffer);
}
(void)memset_s(freeAfterDecodeRpcidInfo.osSysCapIndex, sizeof(uint16_t) * freeAfterDecodeRpcidInfo
@@ -519,12 +519,12 @@ char *DecodeRpcidToStringFormat(const char *inputFile)
priSyscapArray = (char *)malloc(freeAfterDecodeRpcidInfo.sysCapArraySize * SINGLE_SYSCAP_LEN);
if (priSyscapArray == NULL) {
PRINT_ERR("malloc(%u) failed.\n", (uint32_t)freeAfterDecodeRpcidInfo.sysCapArraySize * SINGLE_SYSCAP_LEN);
return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_MALLOC_OSSYSCAP_AFTER_DECODE_RPCID,
return FreeAfterDecodeRpcidToString(&freeAfterDecodeRpcidInfo, FREE_MALLOC_OSSYSCAP_AFTER_DECODE_RPCID,
outBuffer);
}
PartSysCapAndOutBuffer(freeAfterDecodeRpcidInfo, outBuffer, priSyscapArray, sysCapArray);
return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_MALLOC_PRISYSCAP_AFTER_DECODE_RPCID, outBuffer);
PartSysCapAndOutBuffer(&freeAfterDecodeRpcidInfo, outBuffer, priSyscapArray, sysCapArray);
return FreeAfterDecodeRpcidToString(&freeAfterDecodeRpcidInfo, FREE_MALLOC_PRISYSCAP_AFTER_DECODE_RPCID, outBuffer);
}
static int32_t CopySyscopToRet(struct PcidPriSyscapInfo *pcidPriSyscapInfo, const size_t allSyscapNum,