Skip to content

[BUG REPORT] Potential inconsistent state in devfs_setup if devfs_register fails #1499

@DiuDiu777

Description

@DiuDiu777

描述错误
(1) devfs_setup 函数中的错误处理模式可能会导致设备处于“部分初始化”的状态。

pub fn devfs_setup(&self) -> Result<(), SystemError> {
let tty_core = self
.port
.port_data()
.internal_tty()
.ok_or(SystemError::ENODEV)?;
let tty_core_data = tty_core.core();
let devnum = *tty_core_data.device_number();
let vcname = format!("vc{}", self.index.get());
// 注册虚拟终端设备并将虚拟终端设备加入到文件系统
let vcdev = TtyDevice::new(
vcname.clone(),
IdTable::new(vcname, Some(devnum)),
TtyType::Tty,
);
device_register(vcdev.clone())?;
devfs_register(vcdev.name_ref(), vcdev.clone())?;
tty_core_data.set_vc_index(*self.index.get());
self.inner.lock().vcdev = Some(vcdev);
Ok(())
}

  • 119行:device_register 先将设备注册到全局设备层级结构中。

  • 120行:随后 devfs_register 尝试在 DevFS 中创建对应的节点。

如果 device_register 执行成功,但随后的 devfs_register 返回错误,函数会提前返回。目前看起来,device_register 成功后产生的副作用似乎并没有被回滚。

请问这是否可能会导致 vcdev 虽然在全局 kset/设备列表中注册了,但却没有对应的 DevFS 入口,实际上变成了一个占用了设备名但无法正常工作的设备?

(2) 此外,这是否还可能存在一个并发风险?

  • 120 行:注册到 devfs 后,用户空间可能立即看到并打开设备文件。
  • 122 行:self.inner.lock().vcdev = Some(vcdev) 执行前,VirtConsole 内部还没有持有该设备。

也就是如果用户在第 120 行和 122 行之间打开设备并触发回调,驱动程序有可能会因为在 inner 中找不到 vcdev 而出错?

版本信息:

  • DragonOS版本hash:92895534f7c053abb5970491fca9af2cd002b5c1

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-driverArea: 驱动程序bugSomething isn't workingbug-report这是一个bug报告(如果确认是一个bug,请管理人员添加`bug` label)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions