已开启
[任务]: 修复动态驱动注册失败及重复加载的句柄泄漏 #144
liuxingsen创建于  22 天前
liuxingsen成员
22 天前 创建

任务背景

device_driver::load_file() 在动态库已打开但注册入口执行失败时,原先仍正常返回并保留句柄;对同一对象重复加载还可能覆盖旧句柄,失去对应的 dlclose 入口。失败驱动随后可能被工厂缓存。

修复已提交 PR !416,源分支 xiaoxinglxs:0924-mem,提交 57e786db2dcfa738605d31ff551e1914ecbcc2f3。audit/memory-20260924 指向同一修改,不另建重复 PR。

修改范围和清理顺序

  • 第二次 dlopen 前拒绝已持有句柄的对象,保留原句柄。
  • 注册失败时复制错误文本,退出异常处理作用域,再清理设备并 dlclose,最后向调用者抛出框架异常;覆盖普通异常和 throw 42 等非标准异常。
  • 异常对象可能由插件定义,其析构函数位于动态库中,因此必须在卸载库前销毁异常对象。用 C 的资源清理顺序理解,就是“复制错误 → 释放插件对象 → 卸载代码 → 返回失败”。
  • 使用真实测试插件和 RTLD_NOLOAD 验证注册失败后的卸载。

本轮审查发现的测试阻塞

libs/common/tests/test_driver.cpp:436,462 通过 /proc/self/exe 的父目录寻找 libmemory_throwing_driver.so,但该源文件也进入 common_test_lib。libs/devmon/tests/test_csr.cpp 引用同一对象文件内的 test_driver::create(),会将其中的插件测试一同注册到 devmon_test。

插件只生成在 libs/common/tests/,devmon_test 却查找自身所在的 libs/devmon/tests/,因此测试会先因文件不存在而在 dlopen 阶段失败。其 Meson 测试入口也未声明插件构建依赖。建议将独立插件回归拆到仅 common_test 编译的源文件,或者通过 Meson 注入正确路径并声明所有消费入口的依赖。此发现已通过源码/链接引用/构建布局静态核实,本轮尚未重新构建动态复现。

远端 run #79 已核实对应 57e786db:单元测试明确列出 NonstandardRegistrationExceptionClosesHandle 和 PluginDefinedRegistrationExceptionClosesHandle 两条失败。实际入口为部署后的 temp/bin/devmon_test;新增插件没有配置安装,日志也未列出该测试插件的部署。因此整改还要覆盖测试夹具安装/打包,不能只指向本机构建目录。本轮读到的日志片段不含原始 dlopen 异常全文,具体错误路径仍属于源码/部署布局分析。

验收条件

  • 缺注册入口、重复加载、非标准异常及插件定义异常均有回归覆盖,失败驱动不进入成功缓存。
  • common_test 和实际复用测试对象的 devmon_test 均正确处理插件路径与依赖;构建目录入口和 CI 部署入口都具备所需插件夹具。
  • 核实并明确同一实例的并发加载契约;检查通过全局环境变量切换插件行为的既有检视意见。
  • 卸载动态库前复制错误文本并销毁插件异常对象;复制后的错误文本保留至加载失败记录和框架异常构造完成。
  • 当前 SHA 的必要 CI、AI 声明、提交署名与 issue 关联满足要求;实际整改前不标记检视意见已解决。

验证边界

原 57e786db 审计记录 ASAN 配置下 DeviceDriverTest.* 17/17、common_test 408/408,以及真实 .so 卸载检查。原构建目录已不存在,本轮只完成源码审查和差异格式检查,未把历史结果当成本轮重跑。

测试入口使用 std::quick_exit,不能将 detect_leaks=1 解释为已完成正常退出时的 LSAN 泄漏扫描。完整集成测试和目标板测试仍是后续建议。

AI 辅助说明

OpenAI Codex,当前会话运行时 0.155.1;gpt-6-astra 负责本轮只读审查、任务说明及关联。提示词摘要:审视指定日期内存修复分支,复用已有 PR 并补齐任务 issue,区分已验证行为、静态发现和历史测试。本次未修改源码。

likedislike
openUBMC-robot
openUBMC-robot成员
22 天前 评论:

注意

此 Issue 需要负责人。 如果没有指派时, chendanming 是默认的负责人

likedislike
openUBMC-robotopenUBMC-robot成员
22 天前 将 chendanming 设为负责人
Lliuxingsen成员
22 天前 issue状态由 待办的 改变为 进行中
openUBMC-robotopenUBMC-robot成员
22 天前 添加了label:sig/sig-framework
Lliuxingsen成员
22 天前 关联了pull request:fix(driver): 清理注册失败句柄并拒绝重复加载
openUBMC-robot
openUBMC-robot成员
22 天前 评论:

欢迎来到 openUBMC 社区

Hey @xiaoxinglxs , 感谢你对社区的贡献.

机器人使用手册

有关指令的使用,可以点击 说明文档 或 论坛 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。您可以自助配置此仓库的 PR 合并规则,更多详情,请参阅机器人自助配置使用手册。

联系指引

有疑问可以联系 SIG: sig-framework ,
维护者是: @WeliveWelove, @zjp99 ,
优秀贡献者是: @chenshengfan, @leessential .

likedislike
Lliuxingsen成员
22 天前 修改了issue 的描述
Lliuxingsen成员
22 天前 修改了issue 的描述