!42 merge master into master

fix potential invalid address

Created-by: pxh123456
Commit-by: pxh123456
Merged-by: openharmony_ci
Description: ### 一、内容说明(相关的Issue)
解决局部指针传到函数外导致的内存风险
https://gitcode.com/openharmony/multimedia_video_processing_engine/issues/26


### 二、建议测试周期和提测地址  
  建议测试完成时间:2025.11.24
  投产上线时间:2025.11.24  
  提测地址:CI环境/压测环境  
  测试账号:  

### 三、变更内容
  * 3.1 关联PR列表
无i
  * 3.2 数据库和部署说明  
    1常规更新 
  * 3.4 其他技术优化内容(做了什么,变更了什么)
无


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


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

  
### 四、研发自测点(自测哪些?冒烟用例全部自测?)
  自测测试结论:稳定无异常


### 五、测试关注点(需要提醒QA重点关注的、可能会忽略的地方)
  检查点:是否出现稳定性问题

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

  接口测试:功能可用

  性能测试:无性能劣化

  并发测试:无稳定性问题

  其他:



See merge request: openharmony/multimedia_video_processing_engine!42
This commit is contained in:
openharmony_ci
2025-11-25 11:17:31 +08:00
2 changed files with 20 additions and 22 deletions
@@ -86,14 +86,15 @@ void VpeNapi::ThrowExceptionError(napi_env env, const int32_t errCode, const std
napi_throw_error(env, errCodeStr.c_str(), errMsg.c_str());
}
bool VpeNapi::PrepareNapiEnv(napi_env env, napi_callback_info info, NapiValues* nVal)
bool VpeNapi::PrepareNapiEnv(napi_env env, napi_callback_info info, NapiValues* nVal, napi_value* argValue)
{
CHECK_AND_RETURN_RET_LOG(nVal != nullptr, false, "nVal == nullptr");
CHECK_AND_RETURN_RET_LOG(argValue != nullptr, false, "argValue == nullptr");
if (napi_get_undefined(env, &(nVal->result)) != napi_ok) {
VPE_LOGE("Get undefined result failed");
return false;
}
nVal->status = napi_get_cb_info(env, info, &(nVal->argc), nVal->argv, &(nVal->thisVar), nullptr);
nVal->status = napi_get_cb_info(env, info, &(nVal->argc), argValue, &(nVal->thisVar), nullptr);
if (nVal->status != napi_ok) {
VPE_LOGE("fail to napi_get_cb_info");
return false;
@@ -155,8 +156,7 @@ bool VpeNapi::ParseDetailEnhanceParameter(napi_env env, napi_callback_info info)
NapiValues nVal;
nVal.argc = NUM_4; // Use the maximum value to initialize argc before executing PrepareNapiEnv
napi_value argValue[NUM_4] = {0};
nVal.argv = argValue;
CHECK_AND_RETURN_RET_LOG(PrepareNapiEnv(env, info, &nVal), false, "PrepareNapiEnv failed");
CHECK_AND_RETURN_RET_LOG(PrepareNapiEnv(env, info, &nVal, argValue), false, "PrepareNapiEnv failed");
if (nVal.argc != NUM_2 && nVal.argc != NUM_3 && nVal.argc != NUM_4) {
VPE_LOGE("Invalid args count %{public}zu", nVal.argc);
return false;
@@ -169,28 +169,28 @@ bool VpeNapi::ParseDetailEnhanceParameter(napi_env env, napi_callback_info info)
}
CHECK_AND_RETURN_RET_LOG(detailContext_->inputPixelMap != nullptr, false, "inputPixelMap is nullptr!");
if (nVal.argc == NUM_2) { // 2 parameter: pixelmap scaleRatio
CHECK_AND_RETURN_RET_LOG(ConfigResolutionBasedOnRatio(env, nVal.argv[NUM_1], detailContext_),
CHECK_AND_RETURN_RET_LOG(ConfigResolutionBasedOnRatio(env, argValue[NUM_1], detailContext_),
false, "ConfigResolutionBasedOnRatio failed");
detailContext_->qualityLevel = DETAIL_ENH_LEVEL_LOW; // default as low level
}
if (nVal.argc == NUM_3) { // 3 parameter: pixelmap scaleRatio level / pixelmap x y
double valueToCheck = 0;
CHECK_AND_RETURN_RET_LOG(napi_get_value_double(env, nVal.argv[NUM_2], &valueToCheck) == napi_ok,
CHECK_AND_RETURN_RET_LOG(napi_get_value_double(env, argValue[NUM_2], &valueToCheck) == napi_ok,
false, "failed to parse");
if (valueToCheck >= 0 && valueToCheck <= 3) { // if valueToCheck in [0,3], valueToCheck should be level.
CHECK_AND_RETURN_RET_LOG(ConfigResolutionBasedOnRatio(env, nVal.argv[NUM_1], detailContext_), false,
CHECK_AND_RETURN_RET_LOG(ConfigResolutionBasedOnRatio(env, argValue[NUM_1], detailContext_), false,
"ConfigResolutionBasedOnRatio failed");
detailContext_->qualityLevel = static_cast<int>(valueToCheck);
} else {
CHECK_AND_RETURN_RET_LOG(ConfigResolution(env, nVal.argv[NUM_1], nVal.argv[NUM_2], detailContext_),
CHECK_AND_RETURN_RET_LOG(ConfigResolution(env, argValue[NUM_1], argValue[NUM_2], detailContext_),
false, "ConfigResolution failed");
detailContext_->qualityLevel = DETAIL_ENH_LEVEL_LOW; // default as low level
}
}
if (nVal.argc == NUM_4) { // 4 parameter: pixelmap x y level
CHECK_AND_RETURN_RET_LOG(ConfigResolution(env, nVal.argv[NUM_1], nVal.argv[NUM_2], detailContext_),
CHECK_AND_RETURN_RET_LOG(ConfigResolution(env, argValue[NUM_1], argValue[NUM_2], detailContext_),
false, "ConfigResolution failed");
CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, nVal.argv[NUM_3],
CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, argValue[NUM_3],
&(detailContext_->qualityLevel)) == napi_ok, false, "Arg 3 type mismatch");
}
return true;
@@ -679,8 +679,7 @@ bool VpeNapi::ParseDetailImageParameter(napi_env env, napi_callback_info info, N
std::lock_guard<std::mutex> lock(g_contrastLock);
nVal.argc = NUM_9;
napi_value argValue[NUM_9] = {0};
nVal.argv = argValue;
if (!PrepareNapiEnv(env, info, &nVal)) {
if (!PrepareNapiEnv(env, info, &nVal, argValue)) {
return false;
}
if (nVal.argc != NUM_9) {
@@ -692,20 +691,20 @@ bool VpeNapi::ParseDetailImageParameter(napi_env env, napi_callback_info info, N
contrastContext_->inputPixelMap = PixelMapNapi::GetPixelMap(env, argValue[NUM_0]);
CHECK_AND_RETURN_RET_LOG(contrastContext_->inputPixelMap != nullptr, false,
"contrastContext_->srcPixelMap == nullptr, resuse history");
CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, nVal.argv[NUM_1],
CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, argValue[NUM_1],
&(contrastContext_->pixelmapId)) == napi_ok, false, "Arg 1 type mismatch");
CHECK_AND_RETURN_RET_LOG(ParseRect(env, argValue[NUM_2], contrastContext_->curPixelmapArea), false,
"parse pixelmap area failed");
CHECK_AND_RETURN_RET_LOG(ParseRect(env, argValue[NUM_3], contrastContext_->displayArea), false,
"parse display area failed");
CHECK_AND_RETURN_RET_LOG(ParseSize(env, argValue[NUM_4]), false, "parse resolution of original image failed");
CHECK_AND_RETURN_RET_LOG(napi_get_value_bool(env, nVal.argv[NUM_5],
CHECK_AND_RETURN_RET_LOG(napi_get_value_bool(env, argValue[NUM_5],
&(contrastContext_->genFinalEffect)) == napi_ok, false, "Arg 5 type mismatch");
CHECK_AND_RETURN_RET_LOG(napi_get_value_double(env, nVal.argv[NUM_6],
CHECK_AND_RETURN_RET_LOG(napi_get_value_double(env, argValue[NUM_6],
&(contrastContext_->maxRatio)) == napi_ok, false, "Arg 6 type mismatch");
CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, nVal.argv[NUM_7],
CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, argValue[NUM_7],
&(contrastContext_->animationDuration)) == napi_ok, false, "Arg 7 type mismatch");
CHECK_AND_RETURN_RET_LOG(napi_get_value_double(env, nVal.argv[NUM_8],
CHECK_AND_RETURN_RET_LOG(napi_get_value_double(env, argValue[NUM_8],
&(contrastContext_->curRatio)) == napi_ok, false, "Arg 8 type mismatch");
}
contrastContext_->fullRatio = std::min(
@@ -727,8 +726,7 @@ bool VpeNapi::ParseLCDParameter(napi_env env, napi_callback_info info, NapiValue
std::lock_guard<std::mutex> lock(g_contrastLock);
nVal.argc = NUM_3;
napi_value argValue[NUM_3] = {0};
nVal.argv = argValue;
if (!PrepareNapiEnv(env, info, &nVal)) {
if (!PrepareNapiEnv(env, info, &nVal, argValue)) {
return false;
}
if (nVal.argc != NUM_3) {
@@ -739,9 +737,9 @@ bool VpeNapi::ParseLCDParameter(napi_env env, napi_callback_info info, NapiValue
false, "Arg 0 type is not pixelmap");
contrastContext_->lcdPixelMap = PixelMapNapi::GetPixelMap(env, argValue[NUM_0]);
CHECK_AND_RETURN_RET_LOG(contrastContext_->lcdPixelMap != nullptr, false, "pixelmap is nullptr");
CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, nVal.argv[NUM_1],
CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, argValue[NUM_1],
&(contrastContext_->contentId)) == napi_ok, false, "Failed to parse lcd param. Arg 1 type mismatch");
CHECK_AND_RETURN_RET_LOG(napi_get_value_double(env, nVal.argv[NUM_2],
CHECK_AND_RETURN_RET_LOG(napi_get_value_double(env, argValue[NUM_2],
&(contrastContext_->defaultRatio)) == napi_ok, false, "Failed to parse lcd param. Arg 2 type mismatch");
CHECK_AND_RETURN_RET_LOG(contrastContext_->lcdPixelMap->GetWidth() > 0 &&
contrastContext_->lcdPixelMap->GetHeight() > 0, false, "invalid resolution");
@@ -92,7 +92,7 @@ private:
static thread_local std::shared_ptr<ContrastEnhanceContext> contrastContext_;
static thread_local std::shared_ptr<DetailEnhanceContext> detailContext_;
static bool PrepareNapiEnv(napi_env env, napi_callback_info info, NapiValues* nVal);
static bool PrepareNapiEnv(napi_env env, napi_callback_info info, NapiValues* nVal, napi_value* argValue);
static bool ParseRect(napi_env env, napi_value nVal, OHOS::Rect& rect);
static bool ParseSize(napi_env env, napi_value nVal);
static std::shared_ptr<PixelMap> PrepareDstPixelMap(napi_env env, VpeNapi::DetailEnhanceContext* context);