@@ -12,7 +12,6 @@ use std::fmt;
12
12
use std:: io;
13
13
use std:: iter:: IntoIterator ;
14
14
use std:: mem;
15
- use std:: mem:: size_of;
16
15
use std:: net:: Shutdown ;
17
16
use std:: os:: unix:: ffi:: OsStrExt ;
18
17
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,
178
177
return Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput ,
179
178
"path must be no longer than SUN_LEN" ) ) ;
180
179
}
180
+ ( Some ( & 0 ) , _) => { } ,
181
181
( _, Ordering :: Greater ) | ( _, Ordering :: Equal ) => {
182
182
return Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput ,
183
183
"path must be shorter than SUN_LEN" ) ) ;
@@ -1430,6 +1430,44 @@ mod test {
1430
1430
thread. join ( ) . unwrap ( ) ;
1431
1431
}
1432
1432
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
+
1433
1471
#[ test]
1434
1472
fn try_clone ( ) {
1435
1473
let dir = or_panic ! ( TempDir :: new( "unix_socket" ) ) ;
0 commit comments