RSTransactionData::UnmarshallingCommand 在处理命令列表时,只要任意一条命令解析失败(命令未注册、命令体损坏、ReadUint16 读取 type/subtype 失败等),整个函数直接 return false,导致同一事务中后续所有正常命令全部丢失,引发渲染异常(节点不销毁、属性不更新等)且难以定位。
RSTransactionData::UnmarshallingCommand
return false
UnmarshallingCommand
func == nullptr
commandLen
RewindRead
commandLen == 0
commandLen < MIN_COMMAND_BODY_SIZE
Unmarshalling
persist.sys.graphic.commandLenPrefix.enabled
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
rosen/test/render_service/render_service_base/unittest/transaction/rs_transaction_data_test.cpp
新增 TDD 用例:默认属性下向后兼容 round-trip、开启属性后格式协商、未注册命令跳过续解、全部跳过返回 nullptr、非法 commandLen 边界校验、失败命令体隔离不污染后续命令。
问题描述 / Problem
RSTransactionData::UnmarshallingCommand在处理命令列表时,只要任意一条命令解析失败(命令未注册、命令体损坏、ReadUint16 读取 type/subtype 失败等),整个函数直接return false,导致同一事务中后续所有正常命令全部丢失,引发渲染异常(节点不销毁、属性不更新等)且难以定位。复现路径 / Reproduce
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.cpprosen/modules/render_service_base/include/transaction/rs_transaction_data.hrosen/modules/render_service_base/include/platform/common/rs_system_properties.hohos/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 边界校验、失败命令体隔离不污染后续命令。