已开启
【RS】RSTransactionData 反序列化单命令失败导致整包事务丢失,需支持命令长度前缀跳过容错 #2
LyBbq创建于  9月1日
LyBbq成员
9月1日 创建

问题描述 / Problem

RSTransactionData::UnmarshallingCommand 在处理命令列表时,只要任意一条命令解析失败(命令未注册、命令体损坏、ReadUint16 读取 type/subtype 失败等),整个函数直接 return false,导致同一事务中后续所有正常命令全部丢失,引发渲染异常(节点不销毁、属性不更新等)且难以定位。

复现路径 / Reproduce

  1. 应用侧与 RenderService 侧版本不一致(RSCommandFactory 中存在对方未注册的 command type/subType),或 IPC parcel 数据异常;
  2. 发送包含多条命令的 RSTransactionData;
  3. UnmarshallingCommand 解析到未注册命令时 func == nullptr,整体失败,同事务其余命令被丢弃。

期望行为 / Expectation

  • 序列化时可选地为每条命令写入 commandLen(uint32 长度前缀),记录命令体长度;
  • 反序列化时若某条命令解析失败,依据长度前缀 RewindRead 跳过该命令并继续处理后续命令,而不是整体失败;
  • 对 commandLen == 0、commandLen < MIN_COMMAND_BODY_SIZE、commandLen 超过剩余数据等异常值做合法性校验,非法时仍返回失败,防止越界;
  • 全部命令被跳过时 Unmarshalling 返回 nullptr 并记录日志;
  • 行为由系统属性 persist.sys.graphic.commandLenPrefix.enabled 控制,默认关闭,保证向后兼容(老格式 round-trip 不变)。

影响范围 / Impact

  • rosen/modules/render_service_base/src/transaction/rs_transaction_data.cpp
  • rosen/modules/render_service_base/include/transaction/rs_transaction_data.h
  • rosen/modules/render_service_base/include/platform/common/rs_system_properties.h
  • 平台实现:ohos / windows / darwin 的 rs_system_properties.cpp(非 OHOS 平台默认返回 false)
  • 单测:rosen/test/render_service/render_service_base/unittest/transaction/rs_transaction_data_test.cpp

验证 / Test

新增 TDD 用例:默认属性下向后兼容 round-trip、开启属性后格式协商、未注册命令跳过续解、全部跳过返回 nullptr、非法 commandLen 边界校验、失败命令体隔离不污染后续命令。

likedislike