当前位置: 首页 > news >正文

TI的电量计驱动在卸载时导致Linux卡死

背景

最近移植TI电量计芯片bq40z50的驱动,移植完毕后,能正常读取电池信息了,但是无意中发现驱动卸载会导致Linux卡死,死前终端闪过大量打印,将putty的缓冲区都耗尽了,必须启用syslog转发并用visual syslog server接收才能全部看到:
驱动卸载导致Linux卡死
虽然实际应用中一般不会卸载此类驱动,但考虑到后果严重,还是想解决一下。

问题根因

其实,这是一个double freeBUG。

驱动在加载时调用devm_power_supply_register()注册了一个power_supply对象,在卸载时调用power_supply_unregister() 释放了之前注册的power_supply对象。

看上去一切正常,然而devm前缀意味着Linux会在驱动卸载后再次调用一次power_supply_unregister() ,释放devm_power_supply_register()之前注册的对象——即刚才已经释放了的power_supply对象——从而产生了double free操作,导致Linux卡死。

解决方法

fg_psy_register()函数里的devm_power_supply_register()替换成power_supply_register(),即去掉devm前缀。

直接删除fg_psy_unregister函数及对其的调用更好吧?

是的,这样更好,因为devres会在驱动加载失败时或卸载时自动(逆序)释放devm_xxx申请的资源。

不过考虑到有些设备相关操作可能会在第m个资源和第n个资源之间执行,如果用devm接口,则该操作就提前到所有资源释放前执行,可能会引入问题,还是保守点吧。

http://www.lryc.cn/news/296729.html

相关文章:

  • 使用yolo训练自己的模型
  • 堆的概念实现
  • Redis(三)主从架构、Redis哨兵架构、Redis集群方案对比、Redis高可用集群搭建、Redis高可用集群之水平扩展
  • pnpm + vite 从外网迁移到内网环境开发
  • 寒假作业7
  • 【0257】关于pg内核shared cache invalidation messages (概念篇)
  • Nginx 缓存集成、清除、设置不缓存资源
  • C++面试宝典第27题:完全平方数之和
  • webrtc native api的几个要点
  • MinMaxScaler, StandardScaler数据预处理中常用的两种缩放方法,用于将数据标准化或归一化到特定的范围或分布
  • 【Web】vulhub Shiro-550反序列化漏洞复现学习笔记
  • 【论文精读】多模态情感分析 —— VLP-MABSA
  • SQL SELECT TOP, LIMIT, ROWNUM 子句
  • 金融信贷风控评分卡模型
  • 【java苍穹外卖项目实战二】苍穹外卖环境搭建
  • 在 Ubuntu 22.04 上安装 Django Web 框架的方法
  • JVM Java虚拟机入门指南
  • 【错误文档】This与Here的区别、主系表结构、如何合并两个句子、祈使句结构
  • Java入门之JavaSe(韩顺平p1-p?)
  • TCP的连接和断开详解
  • armbian ddns
  • MQTT 服务器(emqx)搭建及使用
  • 【flink状态管理(四)】MemoryStateBackend的实现
  • 前端架构: 脚手架在前端研发流程中的意义
  • Qt网络编程-QTcpServer的封装
  • 【MySQL】_JDBC编程
  • 微信小程序编译出现 project.config.json 文件内容错误
  • 一周学会Django5 Python Web开发-Django5创建项目(用命令方式)
  • DockerUI如何部署结合内网穿透实现公网环境管理本地docker容器
  • UML之在Markdown中使用Mermaid绘制类图