@@ -1195,7 +1195,7 @@ impl SockaddrLike for SockaddrIn {
1195
1195
if ( * addr) . sa_family as i32 != libc:: AF_INET as i32 {
1196
1196
return None ;
1197
1197
}
1198
- Some ( SockaddrIn ( * ( addr as * const libc :: sockaddr_in ) ) )
1198
+ Some ( Self ( ptr :: read_unaligned ( addr as * const _ ) ) )
1199
1199
}
1200
1200
}
1201
1201
@@ -1301,7 +1301,7 @@ impl SockaddrLike for SockaddrIn6 {
1301
1301
if ( * addr) . sa_family as i32 != libc:: AF_INET6 as i32 {
1302
1302
return None ;
1303
1303
}
1304
- Some ( SockaddrIn6 ( * ( addr as * const libc :: sockaddr_in6 ) ) )
1304
+ Some ( Self ( ptr :: read_unaligned ( addr as * const _ ) ) )
1305
1305
}
1306
1306
}
1307
1307
@@ -1870,21 +1870,21 @@ impl SockAddr {
1870
1870
Some ( AddressFamily :: Unix ) => None ,
1871
1871
#[ cfg( feature = "net" ) ]
1872
1872
Some ( AddressFamily :: Inet ) => Some ( SockAddr :: Inet (
1873
- InetAddr :: V4 ( * ( addr as * const libc :: sockaddr_in ) ) ) ) ,
1873
+ InetAddr :: V4 ( ptr :: read_unaligned ( addr as * const _ ) ) ) ) ,
1874
1874
#[ cfg( feature = "net" ) ]
1875
1875
Some ( AddressFamily :: Inet6 ) => Some ( SockAddr :: Inet (
1876
- InetAddr :: V6 ( * ( addr as * const libc :: sockaddr_in6 ) ) ) ) ,
1876
+ InetAddr :: V6 ( ptr :: read_unaligned ( addr as * const _ ) ) ) ) ,
1877
1877
#[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
1878
1878
Some ( AddressFamily :: Netlink ) => Some ( SockAddr :: Netlink (
1879
- NetlinkAddr ( * ( addr as * const libc :: sockaddr_nl ) ) ) ) ,
1879
+ NetlinkAddr ( ptr :: read_unaligned ( addr as * const _ ) ) ) ) ,
1880
1880
#[ cfg( all( feature = "ioctl" ,
1881
1881
any( target_os = "ios" , target_os = "macos" ) ) ) ]
1882
1882
Some ( AddressFamily :: System ) => Some ( SockAddr :: SysControl (
1883
- SysControlAddr ( * ( addr as * const libc :: sockaddr_ctl ) ) ) ) ,
1883
+ SysControlAddr ( ptr :: read_unaligned ( addr as * const _ ) ) ) ) ,
1884
1884
#[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
1885
1885
#[ cfg( feature = "net" ) ]
1886
1886
Some ( AddressFamily :: Packet ) => Some ( SockAddr :: Link (
1887
- LinkAddr ( * ( addr as * const libc :: sockaddr_ll ) ) ) ) ,
1887
+ LinkAddr ( ptr :: read_unaligned ( addr as * const _ ) ) ) ) ,
1888
1888
#[ cfg( any( target_os = "dragonfly" ,
1889
1889
target_os = "freebsd" ,
1890
1890
target_os = "ios" ,
@@ -1894,7 +1894,7 @@ impl SockAddr {
1894
1894
target_os = "openbsd" ) ) ]
1895
1895
#[ cfg( feature = "net" ) ]
1896
1896
Some ( AddressFamily :: Link ) => {
1897
- let ether_addr = LinkAddr ( * ( addr as * const libc :: sockaddr_dl ) ) ;
1897
+ let ether_addr = LinkAddr ( ptr :: read_unaligned ( addr as * const _ ) ) ;
1898
1898
if ether_addr. is_empty ( ) {
1899
1899
None
1900
1900
} else {
@@ -1903,7 +1903,7 @@ impl SockAddr {
1903
1903
} ,
1904
1904
#[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
1905
1905
Some ( AddressFamily :: Vsock ) => Some ( SockAddr :: Vsock (
1906
- VsockAddr ( * ( addr as * const libc :: sockaddr_vm ) ) ) ) ,
1906
+ VsockAddr ( ptr :: read_unaligned ( addr as * const _ ) ) ) ) ,
1907
1907
// Other address families are currently not supported and simply yield a None
1908
1908
// entry instead of a proper conversion to a `SockAddr`.
1909
1909
Some ( _) | None => None ,
@@ -2104,7 +2104,7 @@ pub mod netlink {
2104
2104
if ( * addr) . sa_family as i32 != libc:: AF_NETLINK as i32 {
2105
2105
return None ;
2106
2106
}
2107
- Some ( NetlinkAddr ( * ( addr as * const libc :: sockaddr_nl ) ) )
2107
+ Some ( Self ( ptr :: read_unaligned ( addr as * const _ ) ) )
2108
2108
}
2109
2109
}
2110
2110
@@ -2148,7 +2148,7 @@ pub mod alg {
2148
2148
if ( * addr) . sa_family as i32 != libc:: AF_ALG as i32 {
2149
2149
return None ;
2150
2150
}
2151
- Some ( AlgAddr ( * ( addr as * const libc :: sockaddr_alg ) ) )
2151
+ Some ( Self ( ptr :: read_unaligned ( addr as * const _ ) ) )
2152
2152
}
2153
2153
}
2154
2154
@@ -2220,7 +2220,7 @@ feature! {
2220
2220
pub mod sys_control {
2221
2221
use crate :: sys:: socket:: addr:: AddressFamily ;
2222
2222
use libc:: { self , c_uchar} ;
2223
- use std:: { fmt, mem} ;
2223
+ use std:: { fmt, mem, ptr } ;
2224
2224
use std:: os:: unix:: io:: RawFd ;
2225
2225
use crate :: { Errno , Result } ;
2226
2226
use super :: { private, SockaddrLike } ;
@@ -2262,7 +2262,7 @@ pub mod sys_control {
2262
2262
if ( * addr) . sa_family as i32 != libc:: AF_SYSTEM as i32 {
2263
2263
return None ;
2264
2264
}
2265
- Some ( SysControlAddr ( * ( addr as * const libc :: sockaddr_ctl ) ) )
2265
+ Some ( Self ( ptr :: read_unaligned ( addr as * const _ ) ) )
2266
2266
}
2267
2267
}
2268
2268
@@ -2329,7 +2329,7 @@ pub mod sys_control {
2329
2329
mod datalink {
2330
2330
feature ! {
2331
2331
#![ feature = "net" ]
2332
- use super :: { fmt, mem, private, SockaddrLike } ;
2332
+ use super :: { fmt, mem, private, ptr , SockaddrLike } ;
2333
2333
2334
2334
/// Hardware Address
2335
2335
#[ derive( Clone , Copy , Debug , Eq , Hash , PartialEq ) ]
@@ -2405,7 +2405,7 @@ mod datalink {
2405
2405
if ( * addr) . sa_family as i32 != libc:: AF_PACKET as i32 {
2406
2406
return None ;
2407
2407
}
2408
- Some ( LinkAddr ( * ( addr as * const libc :: sockaddr_ll ) ) )
2408
+ Some ( Self ( ptr :: read_unaligned ( addr as * const _ ) ) )
2409
2409
}
2410
2410
}
2411
2411
@@ -2430,7 +2430,7 @@ mod datalink {
2430
2430
mod datalink {
2431
2431
feature ! {
2432
2432
#![ feature = "net" ]
2433
- use super :: { fmt, mem, private, SockaddrLike } ;
2433
+ use super :: { fmt, mem, private, ptr , SockaddrLike } ;
2434
2434
2435
2435
/// Hardware Address
2436
2436
#[ derive( Clone , Copy , Debug , Eq , Hash , PartialEq ) ]
@@ -2525,7 +2525,7 @@ mod datalink {
2525
2525
if ( * addr) . sa_family as i32 != libc:: AF_LINK as i32 {
2526
2526
return None ;
2527
2527
}
2528
- Some ( LinkAddr ( * ( addr as * const libc :: sockaddr_dl ) ) )
2528
+ Some ( Self ( ptr :: read_unaligned ( addr as * const _ ) ) )
2529
2529
}
2530
2530
}
2531
2531
@@ -2569,7 +2569,7 @@ pub mod vsock {
2569
2569
if ( * addr) . sa_family as i32 != libc:: AF_VSOCK as i32 {
2570
2570
return None ;
2571
2571
}
2572
- Some ( VsockAddr ( * ( addr as * const libc :: sockaddr_vm ) ) )
2572
+ Some ( Self ( ptr :: read_unaligned ( addr as * const _ ) ) )
2573
2573
}
2574
2574
}
2575
2575
@@ -2658,6 +2658,8 @@ mod tests {
2658
2658
}
2659
2659
2660
2660
mod link {
2661
+ #![ allow( clippy:: cast_ptr_alignment) ]
2662
+
2661
2663
use super :: * ;
2662
2664
#[ cfg( any( target_os = "ios" ,
2663
2665
target_os = "macos" ,
@@ -2698,8 +2700,11 @@ mod tests {
2698
2700
) ) ]
2699
2701
#[ test]
2700
2702
fn linux_loopback ( ) {
2701
- let bytes = [ 17u8 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 4 , 3 , 0 , 6 , 1 , 2 , 3 , 4 , 5 , 6 , 0 , 0 ] ;
2702
- let sa = bytes. as_ptr ( ) as * const libc:: sockaddr ;
2703
+ #[ repr( align( 2 ) ) ]
2704
+ struct Raw ( [ u8 ; 20 ] ) ;
2705
+
2706
+ let bytes = Raw ( [ 17u8 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 4 , 3 , 0 , 6 , 1 , 2 , 3 , 4 , 5 , 6 , 0 , 0 ] ) ;
2707
+ let sa = bytes. 0 . as_ptr ( ) as * const libc:: sockaddr ;
2703
2708
let len = None ;
2704
2709
let sock_addr = unsafe { SockaddrStorage :: from_raw ( sa, len) } . unwrap ( ) ;
2705
2710
assert_eq ! ( sock_addr. family( ) , Some ( AddressFamily :: Packet ) ) ;
0 commit comments