mirror of
https://github.com/openharmony/multimedia_av_session.git
synced 2026-08-25 14:20:03 -04:00
75cb61e9cf
修复avsession模块多项并发安全问题(issue #2578部分项) Created-by: devil_red Commit-by: 红袍小恶魔 Merged-by: openharmony_ci Description: ## 关联 Issue fix #2728 本 PR 修复 issue #2728 所列全部 13 个并发缺陷项(含第 7 项既有 ABBA 死锁),合并后请关闭该 issue。 ## 修改内容 **services/session/server/ 服务核心层** - **AVRouterImpl**:`castHandleToInfoMap_`/`providerManagerMap_` 全路径加锁;抽取 `GetCastProvider`/`GetHwProvider` 两个私有帮助函数,统一"锁内取 shared_ptr 快照、锁外调用"(14+3 处调用点收敛);`Init`/`Release` 的 SDK 调用全部移出锁外,仅赋值/置空在锁内;listener 回调锁外或 EventHandler 异步执行,消除锁序反转;修复 `OnCastStateChange` 持 `servicePtrLock_` 调 `checkEnableCast` 的 ABBA 死锁(快照后锁外调用) - **HwCastProvider**:监听器列表遍历改"锁内取快照、锁外回调";`QueryCastSessionId` 补 `mutexLock_` - **SoftbusSessionManager**:`ObtainPeerDeviceId` 补 `socketLock_`,`operator[]` 改 `find`(避免隐式插入默认项) - **AVSessionUsersManager**:`GetContainerFromAll` 补 `userLock_`,消除惰性初始化竞争导致的会话丢失 - **AVSessionService**:`UpdateTopSession` 锁内取 `topSession_` 的 sptr 副本,消除锁外读 UAF - **MigrateAVSessionProxy**:心跳/检查 worker 锁内取 `deviceId_` 快照 **services/session/adapter/** - **AppManagerAdapter**:新增 `appStateChangeObserverLock_`,observer 快照后锁外调用 **frameworks/js/napi(ArkTS 绑定)** - **NapiAVSession(握手按调用私有化)**:`SetAVPlaybackState` 改用 `PlaybackStateSyncContext{mtx,cv,ready,ret}`,删除 5 个进程级 static,根治跨会话返回码串扰;原生调用保持锁内执行(慢 IPC 不误超时),async 侧谓词等待 1s 有界预算;postTask 失败立即定死结果 - **NapiAVSession(静态暂存指针)**:新增 `napiAVSessionLock_` 保护 `napiAVSession_`,`NewInstance`/`ReCreateInstance` 锁内仅做指针赋值/快照,JS/IPC 调用全部锁外,无死锁风险 **interfaces + frameworks/common** - **AVSessionPixelMap**:`bufferLock_` 改 `mutable`,`Marshalling` 加锁 **utils/** - **HashCalculator**:全局 `g_context` 改 `static thread_local`,消除跨线程摘要互相破坏 - **AVSessionRadar**:新增 `deviceInfoLock_` 保护设备 id 惰性初始化与清空 ## 自测 - 全部修改均为锁保护/快照/发布顺序类小步改动,已逐文件复查 diff 并做锁序审计(与现状代码组合无死锁) - 建议在构建环境执行:avsession 相关 UT/FUZZ,以及 `CASTPLUS_CAST_ENGINE_ENABLE`、`DSOFTBUS_ENABLE` 两种开关组合编译 See merge request: openharmony/multimedia_av_session!3326