diff --git a/libs/device/src/device.rs b/libs/device/src/device.rs index 4f5779ce3760aadf4cd0b324258f4f95e6e7439c..3845e21c6485daecdc301a5772ffa0ba9cd9b205 100644 --- a/libs/device/src/device.rs +++ b/libs/device/src/device.rs @@ -246,7 +246,29 @@ impl Device { device.update_properties_bufs()?; - Ok(device) + device.verify() + } + + /// Verify the legality of a device object from nulstr. + fn verify(self) -> Result { + if self.devpath.borrow().is_empty() + || self.subsystem.borrow().is_empty() + || *self.action.borrow() == DeviceAction::Invalid + || *self.seqnum.borrow() == 0 + { + return Err(Error::Nix { + msg: "Received invalid device object from uevent".to_string(), + source: Errno::EINVAL, + }); + } + + if &*self.subsystem.borrow() == "drivers" { + self.set_drivers_subsystem()?; + } + + self.sealed.replace(true); + + Ok(self) } /// create a Device instance from devname @@ -1237,7 +1259,7 @@ impl Device { /// shadow clone a device object and import properties from db pub fn clone_with_db(&self) -> Result { let device = self.shallow_clone()?; - device.read_db()?; + device.read_db_internal(true)?; device.sealed.replace(true); Ok(device) } @@ -3535,9 +3557,13 @@ mod tests { let syspath = dev.get_syspath().unwrap(); let devnum = dev.get_devnum().unwrap(); let id = dev.get_device_id().unwrap(); - let (nulstr, _) = dev.get_properties_nulstr().unwrap(); let devname = dev.get_devname().unwrap(); + dev.set_action_from_string("change").unwrap(); + dev.set_seqnum_from_string("1000").unwrap(); + + let (nulstr, _) = dev.get_properties_nulstr().unwrap(); + let dev_new = Device::from_syspath(&syspath, true).unwrap(); assert_eq!(dev, &dev_new); diff --git a/libs/device/src/device_monitor.rs b/libs/device/src/device_monitor.rs index db51c40fd90ea475728b95af0e16e6bcf743dd27..3f1d1ba64f119a05b8c433055fc0a29a3598636a 100644 --- a/libs/device/src/device_monitor.rs +++ b/libs/device/src/device_monitor.rs @@ -249,8 +249,9 @@ mod tests { /// fn dispatch(&self, e: &Events) -> i32 { - let device = self.device_monitor.receive_device().unwrap(); - println!("{}", device.get_device_id().unwrap()); + if let Ok(device) = self.device_monitor.receive_device() { + println!("{}", device.get_device_id().unwrap()); + } e.set_exit(); 0 }