diff --git a/bundle.json b/bundle.json index 6d5657cb91838d176a0389acc4f43a75f7ef720d..caa571e4a9fe25337dde8f2d4f673d437689ec71 100644 --- a/bundle.json +++ b/bundle.json @@ -16,7 +16,10 @@ "name": "syscap_codec", "subsystem": "developtools", "syscap": [ "SystemCapability.Developtools.Syscap" ], - "feature": [ "syscap_codec_config_path" ], + "feature": [ + "syscap_codec_config_path", + "syscap_codec_config_extern_path" + ], "adapted_system_type": [ "small", "standard" ], "rom": "0", "ram": "0", diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 34cb6f0241ea71b0ff48cb5d8fd9ddc720a2d9e4..c9352970c6697e8c666d4dc314525a1492ee5f6b 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -249,6 +249,7 @@ bool DecodePrivateSyscap(char *input, char (**output)[SINGLE_SYSCAP_LEN], int *o *bufferPos = '\0'; if (sprintf_s(*outputArray, SINGLE_SYSCAP_LEN, "SystemCapability.%s", buffer) == -1) { free(outputArray); + outputArray = NULL; return false; } bufferPos = buffer; @@ -515,7 +516,10 @@ char *DecodeRpcidToStringFormat(const char *inputFile) } PartSysCapAndOutBuffer(freeAfterDecodeRpcidInfo, outBuffer, priSyscapArray, sysCapArray); + + free(priSyscapArray); priSyscapArray = NULL; + return FreeAfterDecodeRpcidToString(freeAfterDecodeRpcidInfo, FREE_MALLOC_PRISYSCAP_AFTER_DECODE_RPCID, outBuffer); } diff --git a/napi/napi_query_syscap.cpp b/napi/napi_query_syscap.cpp index 6f75b2b589dd21fddeb8cfd0355afeae1cea6579..f089b365851032b39ec887fde6ce778207cef8ae 100644 --- a/napi/napi_query_syscap.cpp +++ b/napi/napi_query_syscap.cpp @@ -112,7 +112,7 @@ static char* GetSystemCapability() bool retBool; int retError, priOutputLen, priCapArrayCnt; char osOutput[SINGLE_SYSCAP_LEN] = {}; - + uint32_t *osCapU32 = nullptr; char *priOutput = nullptr; @@ -149,14 +149,13 @@ FREE_PRIOUTPUT: return allSyscapBuffer; } -napi_value QuerySystemCapability(napi_env env, napi_callback_info info) +napi_value PreHandleSystemCapability( + napi_env env, napi_callback_info info, SystemCapabilityAsyncContext *asyncContext) { GET_PARAMS(env, info, 1); NAPI_ASSERT(env, argc <= 1, "too many parameters"); napi_value result = nullptr; - SystemCapabilityAsyncContext* asyncContext = new SystemCapabilityAsyncContext(); - asyncContext->env = env; napi_valuetype valueType = napi_undefined; @@ -172,6 +171,13 @@ napi_value QuerySystemCapability(napi_env env, napi_callback_info info) } else { napi_get_undefined(env, &result); } + return result; +} + +napi_value QuerySystemCapability(napi_env env, napi_callback_info info) +{ + SystemCapabilityAsyncContext *asyncContext = new SystemCapabilityAsyncContext(); + napi_value result = PreHandleSystemCapability(env, info, asyncContext); napi_value resource = nullptr; napi_create_string_utf8(env, "napi_value QuerySystemCapability", NAPI_AUTO_LENGTH, &resource); diff --git a/src/create_pcid.c b/src/create_pcid.c index 6f9a3736903c72b341bd90ee583dfeba32d14a61..531698478299b3f228c1208c8e129b51c1322233 100644 --- a/src/create_pcid.c +++ b/src/create_pcid.c @@ -344,7 +344,6 @@ int32_t GetOsSyscap(PCIDMain *pcidMain, cJSON *sysCapObject) return -1; } - cJSON_Delete(capVectorPtr); return 0; } @@ -362,7 +361,7 @@ int32_t GetPriSyscap(PCIDMain *pcidMain, cJSON *sysCapObject, size_t contextBufL return -1; } - if (contextBufLen < 0 || contextBufLen > UINT32_MAX) { + if (contextBufLen > UINT32_MAX) { PRINT_ERR("the data privateSyscapLen is out of scope."); return GetPriSyscapResult(capVectorPtr, -1); } @@ -898,7 +897,7 @@ int32_t EncodePcidscToString(char *inputFile, char *outDirPath) freePcidInfo.priSyscapFull = (char *)malloc(priSyscapCount * SINGLE_SYSCAP_LEN); if (freePcidInfo.priSyscapFull == NULL) { PRINT_ERR("malloc failed\n"); - return FreeAfterEncodePCID(freePcidInfo, FREE_ENCODE_PCID_PRISYSCAP_FULL_OUT, ret); + return FreeAfterEncodePCID(freePcidInfo, FREE_ENCODE_PCID_CONTEXT_OUT, ret); } (void)memset_s(freePcidInfo.priSyscapFull, priSyscapCount * SINGLE_SYSCAP_LEN, 0, priSyscapCount * SINGLE_SYSCAP_LEN); diff --git a/src/syscap_tool.c b/src/syscap_tool.c index e7b1314d143f6dc2bb476e1686177e4599bd6f90..bcd09fda4e3d9ab93c7553515d75cdeb33c6f246 100644 --- a/src/syscap_tool.c +++ b/src/syscap_tool.c @@ -121,11 +121,13 @@ static int32_t FillOsCapLength(char *convertedBuffer, char *contextBuffer, struc return ret; } -static int32_t FreeAfterRPCIDEncode(char *convertedBuffer, char *contextBuffer, int32_t type, int32_t ret) +static int32_t FreeAfterRPCIDEncode( + cJSON *cjsonObjectRoot, char *convertedBuffer, char *contextBuffer, int32_t type, int32_t ret) { if (type == FREE_CONVERT_OUT_RPCID_ENCODE) { free(convertedBuffer); } + cJSON_Delete(cjsonObjectRoot); FreeContextBuffer(contextBuffer); return ret; } @@ -150,19 +152,19 @@ int32_t RPCIDEncode(char *inputFile, char *outputPath) gJsonObjectSysCap.cjsonObjectRoot = cJSON_ParseWithLength(contextBuffer, bufferLen); if (gJsonObjectSysCap.cjsonObjectRoot == NULL) { PRINT_ERR("cJSON_Parse failed, context buffer is:\n%s\n", contextBuffer); - return FreeAfterRPCIDEncode(convertedBuffer, contextBuffer, FREE_CONTEXT_OUT_RPCID_ENCODE, -1); + return FreeAfterRPCIDEncode(gJsonObjectSysCap.cjsonObjectRoot, convertedBuffer, contextBuffer, FREE_CONTEXT_OUT_RPCID_ENCODE, -1); } gJsonObjectSysCap.sysCapPtr = cJSON_GetObjectItem(gJsonObjectSysCap.cjsonObjectRoot, "syscap"); if (gJsonObjectSysCap.sysCapPtr == NULL || !cJSON_IsArray(gJsonObjectSysCap.sysCapPtr)) { PRINT_ERR("get \"syscap\" object failed.\n"); - return FreeAfterRPCIDEncode(convertedBuffer, contextBuffer, FREE_CONTEXT_OUT_RPCID_ENCODE, -1); + return FreeAfterRPCIDEncode(gJsonObjectSysCap.cjsonObjectRoot, convertedBuffer, contextBuffer, FREE_CONTEXT_OUT_RPCID_ENCODE, -1); } ret = cJSON_GetArraySize(gJsonObjectSysCap.sysCapPtr); if (ret < 0) { PRINT_ERR("get \"syscap\" array size failed\n"); - return FreeAfterRPCIDEncode(convertedBuffer, contextBuffer, FREE_CONTEXT_OUT_RPCID_ENCODE, -1); + return FreeAfterRPCIDEncode(gJsonObjectSysCap.cjsonObjectRoot, convertedBuffer, contextBuffer, FREE_CONTEXT_OUT_RPCID_ENCODE, -1); } sysCapSize = (uint32_t)ret; // 2, to save SysCaptype & SysCapLength @@ -171,19 +173,19 @@ int32_t RPCIDEncode(char *inputFile, char *outputPath) convertedBuffer = (char *)malloc(convertedBufLen); if (convertedBuffer == NULL) { PRINT_ERR("malloc failed\n"); - return FreeAfterRPCIDEncode(convertedBuffer, contextBuffer, FREE_CONTEXT_OUT_RPCID_ENCODE, -1); + return FreeAfterRPCIDEncode(gJsonObjectSysCap.cjsonObjectRoot, convertedBuffer, contextBuffer, FREE_CONTEXT_OUT_RPCID_ENCODE, -1); } (void)memset_s(convertedBuffer, convertedBufLen, 0, convertedBufLen); ret = FillOsCapLength(convertedBuffer, contextBuffer, gJsonObjectSysCap, sysCapSize, ret); if (ret == -1) { - return FreeAfterRPCIDEncode(convertedBuffer, contextBuffer, FREE_CONVERT_OUT_RPCID_ENCODE, ret); + return FreeAfterRPCIDEncode(gJsonObjectSysCap.cjsonObjectRoot, convertedBuffer, contextBuffer,FREE_CONVERT_OUT_RPCID_ENCODE, ret); } ret = ConvertedContextSaveAsFile(outputPath, "rpcid.sc", convertedBuffer, convertedBufLen); if (ret != 0) { PRINT_ERR("ConvertedContextSaveAsFile failed, outputPath:%s, filename:rpcid.sc\n", outputPath); } - return FreeAfterRPCIDEncode(convertedBuffer, contextBuffer, FREE_CONVERT_OUT_RPCID_ENCODE, ret); + return FreeAfterRPCIDEncode(gJsonObjectSysCap.cjsonObjectRoot, convertedBuffer, contextBuffer,FREE_CONVERT_OUT_RPCID_ENCODE, ret); } static int32_t ParseRpcidToJson(char *input, uint32_t inputLen, cJSON *rpcidJson)