Linux 内核崩了,只因拔掉罗技的 USB 接收器.....

整理 | 苏宓
出品 | CSDN(ID:CSDNnews)

近日,据外媒 phoronix 报道,在最新的 Linux 6.6-rc6 内核测试版本发布之前,不少开发者都遇到了一个令人相当尴尬的 Bug,只要用户拔下罗技鼠标的 USB 接收器,就会导致 Linux 内核崩溃。

在发现这一问题之后,红帽公司的 Hans de Goede 工程师开始负责处理这一罗技 USB 接收器断开连接的错误,包括 USB 断开连接导致内核崩溃、USB 上的 power_supply_uevent 导致 page_fault_oops、内核模块 hid_logitech_dj 导致崩溃和 USB 损坏、罗技统一接收器无法正常工作等。

之所以会发生这样的错误,Hans de Goede 在修复接收器 USB 断开时导致内核崩溃的补丁中解释道:hidpp_connect_event()有四个检查时间与使用时间(TOCTOU)的冲突。

其中,hidpp_connect_event() 主要从工作队列运行,但它也在 probe() 上运行,如果当从 probe() 运行 hidpp_connect_event() 的线程在硬件上等待时,硬件收到了一个 "设备连接 "数据包,那么将从工作队列启动第二个运行 hidpp_connect_event() 的线程。

正如上文所述,这就会带来四种不一样的情况:

1. 读取 + 打印协议(无害冲突):

if (!hidpp->protocol_major) {    hidpp_root_get_protocol_version()    hidpp->protocol_major = response.rap.params[0];  }

实际上,我们可以在 rhbz#2227968 所附的 abrt 输出中的 dmesg 中看到这种冲突:

[ 3064.624215] logitech-hidpp-device 0003:046D:4071.0049: HID++ 4.5 device connected. [ 3064.658184] logitech-hidpp-device 0003:046D:4071.0049: HID++ 4.5 device connected.

添加了额外日志的测试表明,在此之后,2 个线程会轮流抓取硬件访问互斥项 (send_mutex),未来的某个时间、某个案例中,便会存在这种 Bug。

2. 将名称更新为 HIDPP 名称(无害冲突):

if (hidpp->name == hdev->name) {    ...    hidpp->name = new_name;  }

3. 为电池初始化 power_supply 类(有问题!):

hidpp_initialize_battery(){        if (hidpp->battery.ps)                return 0;
probe_battery(); /* Blocks, threads take turns executing this */
hidpp->battery.desc.properties = devm_kmemdup(dev, hidpp_battery_props, cnt, GFP_KERNEL);
hidpp->battery.ps = devm_power_supply_register(&hidpp->hid_dev->dev, &hidpp->battery.desc, cfg);}

4. 创建延迟输入设备(可能存在问题):

if (hidpp->delayed_input)    return;
hidpp->delayed_input = hidpp_allocate_input(hdev);

这里最大的问题出现在第三种情况上。冲突会导致以下结果:

  hidpp->battery.desc.properties =    devm_kmemdup(dev, hidpp_battery_props, cnt, GFP_KERNEL);
hidpp->battery.ps = devm_power_supply_register(&hidpp->hid_dev->dev, &hidpp->battery.desc, cfg);
...
hidpp->battery.desc.properties = devm_kmemdup(dev, hidpp_battery_props, cnt, GFP_KERNEL);
hidpp->battery.ps = devm_power_supply_register(&hidpp->hid_dev->dev, &hidpp->battery.desc, cfg);

目前针对这个 Bug 的修复已经合并到本周的 Linux 6.6-rc6 版本的 HID 修复中,并将在接下来的几天内迁移到 Linux 稳定版。

与此同时,如果你使用的是最新的 Linux 内核版本,请不要拔下你的罗技 USB 接收器,以避免可能导致内核崩溃。

来源:https://www.phoronix.com/news/Logitech-USB-Unplug-Linux-Crash

推荐阅读:

 苹果承认iPhone 15系列存在烧屏问题,但拒绝召回;Win11用户量将达5亿;Node.js 21发布 | 极客头条

▶编写一个 “Hello World” 的 Web 服务器,Go、Node.js、Nim 和 Bun 谁更快?

中国大模型掌门人首次集结、全球研发中心掌门人齐聚现场,1024 程序员节「岳麓对话」重磅官宣!

相关推荐

  • 开源联合、聚力共赢丨2023 CCF中国开源大会会议通知
  • 百亿级推送系统的容灾建设与实践
  • 如何让 ChatGPT 更好地思考,以获得更佳的输出效果
  • 1019.AI日报:Midjourney 正式发布了图像放大功能(2倍和4倍)
  • Llama 2第一、GPT-4第三!斯坦福大模型最新测评出炉
  • 上海新基建行动方案发布;传OpenAI寻求860亿美元估值;杨立昆反对过早监管AI丨AIGC大事日报
  • OPPO Find N3真机首发体验!地表最强拍照折叠屏?分屏操作颠覆安卓底层
  • 靠挖掘这个细分市场,他一个人赚了20万,还只是纯利润
  • 向量数据库不是一个单独的数据库分类
  • RTE2023亮点前瞻:聚焦全行业场景、技术出海、智能化 RTE 趋势大洞察
  • 架构师日记-聊聊开发必掌握的那些实践技能
  • 互联网大厂还有这种活动?
  • 揭秘编码器与解码器语言模型
  • 大数据时代下机器学习的新范式
  • Qt 6.5 LTS转为 “仅面向商业客户提供” 阶段
  • 美国政府限制向中国出口NVIDIA H800 GPU
  • 道不尽的卡尔曼!通俗易懂详细解释卡尔曼滤波
  • Go和C++通用性能优化黑魔法——PGO!
  • 华为网络设备系列号查询秘籍,让你轻松掌握设备信息!
  • 21.6K Star开源图床,不仅跨平台还支持各种云