-
-
Notifications
You must be signed in to change notification settings - Fork 167
Open
Labels
A-driverArea: 驱动程序Area: 驱动程序bugSomething isn't workingSomething isn't workingbug-report这是一个bug报告(如果确认是一个bug,请管理人员添加`bug` label)这是一个bug报告(如果确认是一个bug,请管理人员添加`bug` label)
Description
描述错误
(1) devfs_setup 函数中的错误处理模式可能会导致设备处于“部分初始化”的状态。
DragonOS/kernel/src/driver/tty/virtual_terminal/mod.rs
Lines 102 to 125 in 9289553
| 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
Labels
A-driverArea: 驱动程序Area: 驱动程序bugSomething isn't workingSomething isn't workingbug-report这是一个bug报告(如果确认是一个bug,请管理人员添加`bug` label)这是一个bug报告(如果确认是一个bug,请管理人员添加`bug` label)