@@ -768,39 +768,60 @@ impl SockAddr {
768
768
/// with the size of the actual data type. sockaddr is commonly used as a proxy for
769
769
/// a superclass as C doesn't support inheritance, so many functions that take
770
770
/// a sockaddr * need to take the size of the underlying type as well and then internally cast it back.
771
- pub unsafe fn as_ffi_pair ( & self ) -> ( & libc:: sockaddr , libc:: socklen_t ) {
771
+ pub fn as_ffi_pair ( & self ) -> ( & libc:: sockaddr , libc:: socklen_t ) {
772
772
match * self {
773
773
SockAddr :: Inet ( InetAddr :: V4 ( ref addr) ) => (
774
- & * ( addr as * const libc:: sockaddr_in as * const libc:: sockaddr ) ,
774
+ // This cast is always allowed in C
775
+ unsafe {
776
+ & * ( addr as * const libc:: sockaddr_in as * const libc:: sockaddr )
777
+ } ,
775
778
mem:: size_of_val ( addr) as libc:: socklen_t
776
779
) ,
777
780
SockAddr :: Inet ( InetAddr :: V6 ( ref addr) ) => (
778
- & * ( addr as * const libc:: sockaddr_in6 as * const libc:: sockaddr ) ,
781
+ // This cast is always allowed in C
782
+ unsafe {
783
+ & * ( addr as * const libc:: sockaddr_in6 as * const libc:: sockaddr )
784
+ } ,
779
785
mem:: size_of_val ( addr) as libc:: socklen_t
780
786
) ,
781
787
SockAddr :: Unix ( UnixAddr ( ref addr, len) ) => (
782
- & * ( addr as * const libc:: sockaddr_un as * const libc:: sockaddr ) ,
788
+ // This cast is always allowed in C
789
+ unsafe {
790
+ & * ( addr as * const libc:: sockaddr_un as * const libc:: sockaddr )
791
+ } ,
783
792
( len + offset_of ! ( libc:: sockaddr_un, sun_path) ) as libc:: socklen_t
784
793
) ,
785
794
#[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
786
795
SockAddr :: Netlink ( NetlinkAddr ( ref sa) ) => (
787
- & * ( sa as * const libc:: sockaddr_nl as * const libc:: sockaddr ) ,
796
+ // This cast is always allowed in C
797
+ unsafe {
798
+ & * ( sa as * const libc:: sockaddr_nl as * const libc:: sockaddr )
799
+ } ,
788
800
mem:: size_of_val ( sa) as libc:: socklen_t
789
801
) ,
790
802
#[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
791
803
SockAddr :: Alg ( AlgAddr ( ref sa) ) => (
792
- & * ( sa as * const libc:: sockaddr_alg as * const libc:: sockaddr ) ,
804
+ // This cast is always allowed in C
805
+ unsafe {
806
+ & * ( sa as * const libc:: sockaddr_alg as * const libc:: sockaddr )
807
+ } ,
793
808
mem:: size_of_val ( sa) as libc:: socklen_t
794
809
) ,
795
810
#[ cfg( any( target_os = "ios" , target_os = "macos" ) ) ]
796
811
SockAddr :: SysControl ( SysControlAddr ( ref sa) ) => (
797
- & * ( sa as * const libc:: sockaddr_ctl as * const libc:: sockaddr ) ,
812
+ // This cast is always allowed in C
813
+ unsafe {
814
+ & * ( sa as * const libc:: sockaddr_ctl as * const libc:: sockaddr )
815
+ } ,
798
816
mem:: size_of_val ( sa) as libc:: socklen_t
799
817
800
818
) ,
801
819
#[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
802
820
SockAddr :: Link ( LinkAddr ( ref addr) ) => (
803
- & * ( addr as * const libc:: sockaddr_ll as * const libc:: sockaddr ) ,
821
+ // This cast is always allowed in C
822
+ unsafe {
823
+ & * ( addr as * const libc:: sockaddr_ll as * const libc:: sockaddr )
824
+ } ,
804
825
mem:: size_of_val ( addr) as libc:: socklen_t
805
826
) ,
806
827
#[ cfg( any( target_os = "dragonfly" ,
@@ -810,12 +831,18 @@ impl SockAddr {
810
831
target_os = "netbsd" ,
811
832
target_os = "openbsd" ) ) ]
812
833
SockAddr :: Link ( LinkAddr ( ref addr) ) => (
813
- & * ( addr as * const libc:: sockaddr_dl as * const libc:: sockaddr ) ,
834
+ // This cast is always allowed in C
835
+ unsafe {
836
+ & * ( addr as * const libc:: sockaddr_dl as * const libc:: sockaddr )
837
+ } ,
814
838
mem:: size_of_val ( addr) as libc:: socklen_t
815
839
) ,
816
840
#[ cfg( target_os = "linux" ) ]
817
841
SockAddr :: Vsock ( VsockAddr ( ref sa) ) => (
818
- & * ( sa as * const libc:: sockaddr_vm as * const libc:: sockaddr ) ,
842
+ // This cast is always allowed in C
843
+ unsafe {
844
+ & * ( sa as * const libc:: sockaddr_vm as * const libc:: sockaddr )
845
+ } ,
819
846
mem:: size_of_val ( sa) as libc:: socklen_t
820
847
) ,
821
848
}
0 commit comments