已合并
fix application agent stub crash at so unload via synchronous unregister IPC and lifecycle owner #31855
fix application agent stub crash at so unload via synchronous unregister IPC and lifecycle owner #31855
已合并
LyBbq创建于 7月31日
LyBbq成员
7月31日

Description:

问题背景:

RSApplicationAgentImpl 是客户端侧 binder stub,注册到 render service 后服务端持有其 proxy 强引用。旧清理链路存在两个问题:

  1. 时序不确定:客户端侧依赖连接死亡回调(RSRenderServiceConnectHub 的 OnDiedCallbacks → RSApplicationAgentImpl::Destroy()),服务端侧依赖 RSClientToRenderConnection::CleanAll 在连接删除时顺带注销。若客户端 so 被 dlclose 卸载时服务端仍持有 agent proxy,binder 内核延迟下发的 DecStrongRef 会析构一个 vtable 已 unmap 的 stub,导致应用进程 SEGV;
  2. 并发不安全:isDestreuctionProcess_ 为非原子 bool,Instance() 每次调用重复注册死亡回调,Destroy() 与注册流程存在竞态。

修复方案:

  1. 新增同步注销 IPC UNREGISTER_APPLICATION_AGENT(0x000010):proxy 以 TF_SYNC 发送、不携带参数——服务端按 calling pid 反查 agent 并注销、摘除 death recipient。同步等待确保客户端析构 stub 前服务端已释放 proxy 强引用;同步补齐 access verifier(限频 15 次)、safuzz 名称表、stub descriptor 白名单
  2. 客户端确定性主动注销:Destroy() 重构为幂等的 Release()——持锁清空全局单例,若曾注册则调用静态 UnregisterFromAllConnections(),经新增 GetAllClientToRenderConnections()(锁下快照)遍历所有渲染进程连接逐一发注销 IPC,映射为空时回退默认连接;整体删除 SetOnDiedCallback / RemoveOnDiedCallback / ExecuteAndClearDiedCallbacks 死亡回调机制及对应单测
  3. 生命周期锚点:新增 RSApplicationAgentLifecycleOwner 函数局部静态——首次使用(RSUIDirector::Init)时构造并注册 agent,静态析构时驱动一次 Release()。利用 librender_service_client 先于 librender_service_base 卸载的依赖顺序,保证发出同步注销 IPC 时连接仍可用、stub 代码段仍处于映射状态
  4. 注册防重:RegisterRSApplicationAgent 改为 mutex_ + 原子 isRegistered_ 标志,替代原函数内静态 atomic,与 Release() 互斥;服务端 CleanAll 不再顺带注销 app agent(职责移交显式 IPC)

Issue number:https://gitcode.com/openharmony/graphic_graphic_2d/issues/25408

Test & Result:

  • 门禁通过:静态检查、编译、冒烟测试均成功,已合入 master
  • dlclose 卸载客户端库的复现场景不再出现 agent stub 延迟析构 SEGV;多次 Init/Release 幂等无泄漏

CodeCheck:

类型 自检项 自检结果
多线程 在类的成员变量中定义了vector/map/list等容器类型,且在多个成员函数中有操作时,需要加锁保护 自检结果:
定义全局变量,在多个函数中都有操作时,需要加锁保护 自检结果:
内存操作 调用外部接口时,确认是否对返回值做了判空判断,尤其外部接口返回了nullptr的情况,避免进程崩溃 自检结果:
内存操作优先使用安全函数,并检查其返回值 自检结果:
注意每个异常退出流程,是否都已经将资源释放(推荐使用RAII) 自检结果:
隐式内存分配场景:realpath、ReadParcelable序列化、cJSON相关函数时等,需主动释放或使用智能指针 自检结果:
外部输入 所有外部输入均不可信,需判断外部输入是否直接作为内存分配的大小,数组下标、循环条件、SQL查询等 自检结果:
注意外部字符串数据有无尾0 自检结果:
外部输入的路径不可信,需使用realpath做标准化处理,并判断路径的合法性 自检结果:
敏感信息 注意日志中打印敏感信息需匿名化 自检结果:
数学运算 代码中是否混合了加减乘除等运算,需检查是否可能导致整数溢出或符号翻转 自检结果:
初始化 类成员、局部变量使用前需初始化 自检结果:
权限管理 作为系统服务对外提供了接口(或RSCmd),是否做了权限保护和校验,只允许申请了权限的应用访问 自检结果:

L0新增用例自检结果

likedislike
Pull Request已成功合入, 合并人@openharmony_ci
(感谢 LyBbq 的贡献)
LLyBbq成员
7月31日 关联了issue:[Bug]: fixCrashClient
openharmony_ciopenharmony_ci成员
7月31日 添加了label:waiting_on_author
openharmony_ci
openharmony_ci成员
7月31日 评论:

感谢提交 Pull Requests!如果您提交的PR已经开发完毕,请评论 "start build" 触发门禁,更多交互操作,请访问OpenHarmony社区支持命令清单。如果需要调整订阅PR、Issue的变更状态,请访问订阅链接


Thanks for submitting the pull request. If your Pull Request has already been developed, you can leave a "start build" comment to trigger the gated system. For more commands, please visit OpenHarmony Command List. If you need to change the subscription of a Pull Request or Issue, please visit the link.

likedislike
openharmony_ciopenharmony_ci成员
7月31日 添加了label:dco检查成功
chuchengcheng
chuchengcheng成员8月1日进行代码检视2
rosen/modules/render_service_client/core/transaction/rs_application_agent_impl.cpp
已过期
@@ -103,0 +125,4 @@
125+ return instance;
126+}
127+ 
128+RSApplicationAgentLifecycleOwner::RSApplicationAgentLifecycleOwner() = default;
chuchengcheng
chuchengcheng8月1日评论:

这个为啥要独立写?

likedislike
System
系统消息系统
8月1日 评论:

changed this line on 5a716f80 view diff detail

此处折叠了101条消息 查看更多
openharmony_ciopenharmony_ci成员
8月10日 删除了label:waiting_for_review
openharmony_ciopenharmony_ci成员
8月10日 添加了label:merged
LLyBbq成员
19 天前 修改标题为 “fix application agent stub crash at so unload via synchronous unregister IPC and lifecycle owner”,原标题为“fix application”
LLyBbq成员
19 天前 修改了pull request 的描述
LLyBbq成员
19 天前 修改了pull request 的描述