diff --git a/core/coms/socket/src/rentry.rs b/core/coms/socket/src/rentry.rs index 50b0b0e5234d329be3e45fa955aee04590ac8dbf..59651f923d9f7a89f7116a20c61905d7ca9cc90e 100644 --- a/core/coms/socket/src/rentry.rs +++ b/core/coms/socket/src/rentry.rs @@ -42,6 +42,12 @@ fn deserialize_pathbuf_vec(s: &str) -> Result, core::error::Error> Ok(res) } +fn deserialize_parse_mode(s: &str) -> Result { + u32::from_str_radix(s, 8).map_err(|_| core::error::Error::ConfigureError { + msg: format!("Invalid SocketMode: {}", s), + }) +} + fn deserialize_netlink_vec(s: &str) -> Result, core::error::Error> { Ok(vec![s.to_string()]) } @@ -92,7 +98,7 @@ pub(super) struct SectionSocket { #[entry(append, parser = deserialize_pathbuf_vec)] pub Symlinks: Vec, pub PassSecurity: Option, - #[entry(default = 0o666)] + #[entry(default = 0o666, parser = deserialize_parse_mode)] pub SocketMode: u32, #[entry(default = String::new())] pub SocketUser: String, @@ -408,3 +414,20 @@ impl ReDbTable for SocketReDb { self.0.switch_buffer(switch); } } + +#[cfg(test)] + +mod test { + use super::deserialize_parse_mode; + + #[test] + fn test_deserialize_parse_mode() { + assert_eq!(deserialize_parse_mode("777").unwrap(), 0o777); + assert_eq!(deserialize_parse_mode("644").unwrap(), 0o644); + assert!(deserialize_parse_mode("-777").is_err()); + assert!(deserialize_parse_mode("787").is_err()); + assert!(deserialize_parse_mode("777aa").is_err()); + assert!(deserialize_parse_mode("aaaaa").is_err()); + assert!(deserialize_parse_mode("777 aa").is_err()); + } +}