Skip to content
This repository was archived by the owner on May 17, 2018. It is now read-only.

Commit ab782fa

Browse files
committed
fix abstract socket address with max length
(Some(&0), Ordering::Equal) was matching the second arm of the match
1 parent 8b282e1 commit ab782fa

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

src/lib.rs

+39-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ use std::fmt;
1212
use std::io;
1313
use std::iter::IntoIterator;
1414
use std::mem;
15-
use std::mem::size_of;
1615
use std::net::Shutdown;
1716
use std::os::unix::ffi::OsStrExt;
1817
use std::os::unix::io::{RawFd, AsRawFd, FromRawFd, IntoRawFd};
@@ -178,6 +177,7 @@ unsafe fn sockaddr_un<P: AsRef<Path>>(path: P) -> io::Result<(libc::sockaddr_un,
178177
return Err(io::Error::new(io::ErrorKind::InvalidInput,
179178
"path must be no longer than SUN_LEN"));
180179
}
180+
(Some(&0), _) => {},
181181
(_, Ordering::Greater) | (_, Ordering::Equal) => {
182182
return Err(io::Error::new(io::ErrorKind::InvalidInput,
183183
"path must be shorter than SUN_LEN"));
@@ -1430,6 +1430,44 @@ mod test {
14301430
thread.join().unwrap();
14311431
}
14321432

1433+
#[test]
1434+
#[cfg(target_os = "linux")]
1435+
fn abstract_address_max_len() {
1436+
use os::linux::SocketAddrExt;
1437+
1438+
let len = unsafe {
1439+
let addr: libc::sockaddr_un = mem::zeroed();
1440+
addr.sun_path.len()
1441+
};
1442+
1443+
let mut socket_path = vec![0; len];
1444+
socket_path[1..9].copy_from_slice(b"the path");
1445+
let socket_path: &OsStr = OsStr::from_bytes(&socket_path).into();
1446+
1447+
let msg1 = b"hello";
1448+
let msg2 = b"world!";
1449+
1450+
let listener = or_panic!(UnixListener::bind(&socket_path));
1451+
let thread = thread::spawn(move || {
1452+
let mut stream = or_panic!(listener.accept()).0;
1453+
let mut buf = [0; 5];
1454+
or_panic!(stream.read(&mut buf));
1455+
assert_eq!(&msg1[..], &buf[..]);
1456+
or_panic!(stream.write_all(msg2));
1457+
});
1458+
1459+
let mut stream = or_panic!(UnixStream::connect(&socket_path));
1460+
assert_eq!(Some(&socket_path.as_bytes()[1..]),
1461+
stream.peer_addr().unwrap().as_abstract());
1462+
or_panic!(stream.write_all(msg1));
1463+
let mut buf = vec![];
1464+
or_panic!(stream.read_to_end(&mut buf));
1465+
assert_eq!(&msg2[..], &buf[..]);
1466+
drop(stream);
1467+
1468+
thread.join().unwrap();
1469+
}
1470+
14331471
#[test]
14341472
fn try_clone() {
14351473
let dir = or_panic!(TempDir::new("unix_socket"));

0 commit comments

Comments
 (0)