From d361727577f9ba794c64ebeed36bfa904b3a1770 Mon Sep 17 00:00:00 2001 From: zhang_hao_zheng Date: Tue, 17 Mar 2026 10:26:29 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20startupManager.?= =?UTF-8?q?run=20=E4=B8=8D=E4=BC=A0=20config=20=E6=97=B6=E7=9A=84=E7=A9=BA?= =?UTF-8?q?=E6=8C=87=E9=92=88=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:当调用 startupManager.run(['taskNotExist']) 不传 config 参数时, 会因为空指针解引用而崩溃,崩溃栈指向: OHOS::AbilityRuntime::ETSStartupConfig::GetTimeoutMs 根本原因: 1. GetTimeoutMs() 方法没有检查 config 参数是否为 nullptr 2. BuildAppStartupTaskManager() 和 BuildAutoAppStartupTaskManager() 直接使用可能为 null 的 defaultConfig_ 或 startupConfig 修复: 1. 在 GetTimeoutMs() 中添加 config 的 null 检查 2. 在 BuildAppStartupTaskManager() 中添加 defaultConfig_ 的 null 检查 3. 在 BuildAutoAppStartupTaskManager() 中添加 startupConfig 的 null 检查 这样即使不传 config 参数,也会使用默认的 timeout 值, 不会因为空指针访问而导致崩溃。 Signed-off-by: zhang_hao_zheng --- .../native/appkit/app_startup/ets_startup_config.cpp | 4 ++++ frameworks/native/appkit/app_startup/startup_manager.cpp | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/frameworks/native/appkit/app_startup/ets_startup_config.cpp b/frameworks/native/appkit/app_startup/ets_startup_config.cpp index 233c665688..9a672368d0 100644 --- a/frameworks/native/appkit/app_startup/ets_startup_config.cpp +++ b/frameworks/native/appkit/app_startup/ets_startup_config.cpp @@ -141,6 +141,10 @@ bool ETSStartupConfig::GetTimeoutMs(ani_env *env, ani_object config, int32_t &ti TAG_LOGE(AAFwkTag::STARTUP, "null env"); return false; } + if (config == nullptr) { + TAG_LOGE(AAFwkTag::STARTUP, "null config"); + return false; + } ani_status status = env->FindClass("@ohos.app.appstartup.StartupConfig.StartupConfig", &cls); if (status != ANI_OK || cls == nullptr) { TAG_LOGE(AAFwkTag::STARTUP, "Findclass failed, status: %{public}d", status); diff --git a/frameworks/native/appkit/app_startup/startup_manager.cpp b/frameworks/native/appkit/app_startup/startup_manager.cpp index 15d9b9eaf1..391f2736ab 100644 --- a/frameworks/native/appkit/app_startup/startup_manager.cpp +++ b/frameworks/native/appkit/app_startup/startup_manager.cpp @@ -185,7 +185,9 @@ int32_t StartupManager::BuildAutoAppStartupTaskManager(std::shared_ptr(startupTaskManagerId, autoStartupTasks); - startupTaskManager->SetConfig(startupConfig); + if (startupConfig != nullptr) { + startupTaskManager->SetConfig(startupConfig); + } startupTaskManagerMap_.emplace(startupTaskManagerId, startupTaskManager); startupTaskManagerId++; return ERR_OK; @@ -283,7 +285,9 @@ int32_t StartupManager::BuildAppStartupTaskManager(const std::vector(startupTaskManagerId, currentStartupTasks); - startupTaskManager->SetConfig(defaultConfig_); + if (defaultConfig_ != nullptr) { + startupTaskManager->SetConfig(defaultConfig_); + } startupTaskManagerMap_.emplace(startupTaskManagerId, startupTaskManager); startupTaskManagerId++; return ERR_OK; From 15d2db0f51a3374d7b97382c79698258b1d8d794 Mon Sep 17 00:00:00 2001 From: zhang_hao_zheng Date: Wed, 1 Apr 2026 17:48:28 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20startupManager.?= =?UTF-8?q?run=20=E4=B8=8D=E4=BC=A0=20config=20=E6=97=B6=20ANI=20undefined?= =?UTF-8?q?=20=E5=AF=BC=E8=87=B4=E7=9A=84=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:当从ETS/ArkTS调用 startupManager.run(['task']) 不传config时, ETS层传入的 startupConfig 是 ANI undefined 引用而非 C++ nullptr。 config == nullptr 检查无法拦截 undefined,导致后续对 undefined 对象调用 Object_CallMethod_Ref 时crash,崩溃栈指向 GetTimeoutMs。 根因:ets_startup_manager.cpp GetStartupTaskManager() 中无条件调用 GetConfig(),而 GetConfig 内部使用 config == nullptr 判断, ANI undefined 引用不等于 nullptr。 修复: 1. [主要修复] ets_startup_manager.cpp GetStartupTaskManager中, 调用GetConfig前使用 env->Reference_IsUndefined() 检查startupConfig, 若为undefined则跳过config初始化(与NAPI路径行为一致) 2. [防御] ets_startup_config.cpp Init中增加undefined检查 Signed-off-by: zhang_hao_zheng Co-Authored-By: Agent Change-Id: I492bfa0fdc7a1c844ab7912017e0f377159ec8d9 --- .../startup_manager/src/ets_startup_manager.cpp | 12 ++++++++---- .../native/appkit/app_startup/ets_startup_config.cpp | 6 ++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp b/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp index a7a687c7b9..6af7925fb6 100644 --- a/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp +++ b/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp @@ -211,10 +211,14 @@ int32_t ETSStartupManager::GetStartupTaskManager(ani_env *env, ani_object startu return ERR_STARTUP_INVALID_VALUE; } std::shared_ptr config; - int32_t result = GetConfig(env, startupConfig, config); - if (result != ERR_OK) { - TAG_LOGE(AAFwkTag::STARTUP, "get config failed"); - return result; + ani_boolean isConfigUndefined = ANI_TRUE; + env->Reference_IsUndefined(reinterpret_cast(startupConfig), &isConfigUndefined); + if (!isConfigUndefined) { + int32_t result = GetConfig(env, startupConfig, config); + if (result != ERR_OK) { + TAG_LOGE(AAFwkTag::STARTUP, "get config failed"); + return result; + } } bool supportFeatureModule = isDefaultContext != ANI_TRUE; result = DelayedSingleton::GetInstance()->BuildAppStartupTaskManager(dependencies, diff --git a/frameworks/native/appkit/app_startup/ets_startup_config.cpp b/frameworks/native/appkit/app_startup/ets_startup_config.cpp index 9a672368d0..38869ce90c 100644 --- a/frameworks/native/appkit/app_startup/ets_startup_config.cpp +++ b/frameworks/native/appkit/app_startup/ets_startup_config.cpp @@ -97,6 +97,12 @@ int32_t ETSStartupConfig::Init(ani_object config) TAG_LOGE(AAFwkTag::STARTUP, "null config"); return ERR_STARTUP_INTERNAL_ERROR; } + ani_boolean isUndefined = ANI_TRUE; + env->Reference_IsUndefined(reinterpret_cast(config), &isUndefined); + if (isUndefined) { + TAG_LOGE(AAFwkTag::STARTUP, "undefined config"); + return ERR_STARTUP_INTERNAL_ERROR; + } InitAwaitTimeout(env, config); InitListener(env, config); From 7d9447b6a31c1a9e72323c07100cb364411da3d0 Mon Sep 17 00:00:00 2001 From: zhang_hao_zheng Date: Wed, 1 Apr 2026 19:41:11 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E6=A0=A1=E9=AA=8C=E7=A9=BA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E4=BB=BB=E5=8A=A1=E5=90=8D=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=200800=20=E7=94=A8=E4=BE=8B=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=A0=81=E4=B8=8D=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit startupManager.run(['']) 传入空字符串任务名时,穿透到 BuildAppStartupTaskManager 返回 ERR_STARTUP_DEPENDENCY_NOT_FOUND(28800001), 而测试期望 ERR_STARTUP_INVALID_VALUE(401)。 在 UnwrapArrayString 后增加空字符串校验,提前返回 401。 同时将 int32_t result 声明移到 if 块外部,修复变量作用域问题。 Signed-off-by: zhang_hao_zheng Co-Authored-By: Agent Change-Id: I327992fb369664176fe20603675f7dd7849b71c5 --- .../startup_manager/src/ets_startup_manager.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp b/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp index 6af7925fb6..5f829fd293 100644 --- a/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp +++ b/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp @@ -210,11 +210,18 @@ int32_t ETSStartupManager::GetStartupTaskManager(ani_env *env, ani_object startu TAG_LOGE(AAFwkTag::STARTUP, "get dependencies failed"); return ERR_STARTUP_INVALID_VALUE; } + for (const auto &dep : dependencies) { + if (dep.empty()) { + TAG_LOGE(AAFwkTag::STARTUP, "empty task name"); + return ERR_STARTUP_INVALID_VALUE; + } + } std::shared_ptr config; ani_boolean isConfigUndefined = ANI_TRUE; env->Reference_IsUndefined(reinterpret_cast(startupConfig), &isConfigUndefined); + int32_t result = ERR_OK; if (!isConfigUndefined) { - int32_t result = GetConfig(env, startupConfig, config); + result = GetConfig(env, startupConfig, config); if (result != ERR_OK) { TAG_LOGE(AAFwkTag::STARTUP, "get config failed"); return result; From ebe80e7ef681f88aa11d7a25b2e45f9109c3f5be Mon Sep 17 00:00:00 2001 From: zhang_hao_zheng Date: Wed, 1 Apr 2026 19:50:54 +0800 Subject: [PATCH 4/4] =?UTF-8?q?Revert=20"fix:=20=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E7=A9=BA=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=BB=BB=E5=8A=A1=E5=90=8D?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 回退空字符串校验,保持 ANI 与 NAPI 行为一致。 NAPI 侧不校验空字符串任务名,ANI 侧不应额外添加。 0800 用例的期望错误码需要单独修正。 This reverts commit 7d9447b6a3. Signed-off-by: zhang_hao_zheng Co-Authored-By: Agent Change-Id: Ib1d7820fac0a143327bede8f9df43c38058b614b --- .../app_startup/startup_manager/src/ets_startup_manager.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp b/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp index 5f829fd293..47e34f13e5 100644 --- a/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp +++ b/frameworks/ets/ani/app_startup/startup_manager/src/ets_startup_manager.cpp @@ -210,12 +210,6 @@ int32_t ETSStartupManager::GetStartupTaskManager(ani_env *env, ani_object startu TAG_LOGE(AAFwkTag::STARTUP, "get dependencies failed"); return ERR_STARTUP_INVALID_VALUE; } - for (const auto &dep : dependencies) { - if (dep.empty()) { - TAG_LOGE(AAFwkTag::STARTUP, "empty task name"); - return ERR_STARTUP_INVALID_VALUE; - } - } std::shared_ptr config; ani_boolean isConfigUndefined = ANI_TRUE; env->Reference_IsUndefined(reinterpret_cast(startupConfig), &isConfigUndefined);