comparison src/lib.rs @ 2:cabc4aafdd85

Added length check and a few tests Systemd socket names must not exceed 255 chars, so this change satity checks the limit.
author Martin Habovstiak <martin.habovstiak@gmail.com>
date Fri, 27 Nov 2020 10:21:07 +0100
parents a65053246c29
children 0edcde404b02
comparison
equal deleted inserted replaced
1:ef8bf41097ac 2:cabc4aafdd85
161 161
162 // We can't impl<T: Deref<Target=str> + Into<String>> TryFrom<T> for SocketAddr because of orphan 162 // We can't impl<T: Deref<Target=str> + Into<String>> TryFrom<T> for SocketAddr because of orphan
163 // rules. 163 // rules.
164 fn try_from_generic<'a, T>(string: T) -> Result<Self, ParseError> where T: 'a + std::ops::Deref<Target=str> + Into<String> { 164 fn try_from_generic<'a, T>(string: T) -> Result<Self, ParseError> where T: 'a + std::ops::Deref<Target=str> + Into<String> {
165 if string.starts_with(SYSTEMD_PREFIX) { 165 if string.starts_with(SYSTEMD_PREFIX) {
166 let name_len = string.len() - SYSTEMD_PREFIX.len();
166 match string[SYSTEMD_PREFIX.len()..].chars().enumerate().find(|(_, c)| !c.is_ascii() || *c < ' ' || *c == ':') { 167 match string[SYSTEMD_PREFIX.len()..].chars().enumerate().find(|(_, c)| !c.is_ascii() || *c < ' ' || *c == ':') {
167 None => Ok(SocketAddr(SocketAddrInner::Systemd(string.into()))), 168 None if name_len <= 255 => Ok(SocketAddr(SocketAddrInner::Systemd(string.into()))),
169 None => Err(ParseErrorInner::LongSocketName { string: string.into(), len: name_len }.into()),
168 Some((pos, c)) => Err(ParseErrorInner::InvalidCharacter { string: string.into(), c, pos, }.into()), 170 Some((pos, c)) => Err(ParseErrorInner::InvalidCharacter { string: string.into(), c, pos, }.into()),
169 } 171 }
170 } else { 172 } else {
171 Ok(string.parse().map(SocketAddrInner::Ordinary).map(SocketAddr).map_err(ParseErrorInner::SocketAddr)?) 173 Ok(string.parse().map(SocketAddrInner::Ordinary).map(SocketAddr).map_err(ParseErrorInner::SocketAddr)?)
172 } 174 }
305 307
306 #[test] 308 #[test]
307 fn parse_systemd() { 309 fn parse_systemd() {
308 assert_eq!("systemd://foo".parse::<SocketAddr>().unwrap().0, SocketAddrInner::Systemd("systemd://foo".to_owned())); 310 assert_eq!("systemd://foo".parse::<SocketAddr>().unwrap().0, SocketAddrInner::Systemd("systemd://foo".to_owned()));
309 } 311 }
310 } 312
313 #[test]
314 #[should_panic]
315 fn parse_systemd_fail_control() {
316 "systemd://foo\n".parse::<SocketAddr>().unwrap();
317 }
318
319 #[test]
320 #[should_panic]
321 fn parse_systemd_fail_colon() {
322 "systemd://foo:".parse::<SocketAddr>().unwrap();
323 }
324
325 #[test]
326 #[should_panic]
327 fn parse_systemd_fail_non_ascii() {
328 "systemd://fooĆ”".parse::<SocketAddr>().unwrap();
329 }
330
331 #[test]
332 #[should_panic]
333 fn parse_systemd_fail_too_long() {
334 "systemd://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".parse::<SocketAddr>().unwrap();
335 }
336 }