@@ -763,6 +763,22 @@ impl SockaddrLike for UnixAddr {
763
763
{
764
764
mem:: size_of :: < libc:: sockaddr_un > ( ) as libc:: socklen_t
765
765
}
766
+
767
+ unsafe fn set_length ( & mut self , new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > {
768
+ cfg_if ! {
769
+ if #[ cfg( any( target_os = "android" ,
770
+ target_os = "fuchsia" ,
771
+ target_os = "illumos" ,
772
+ target_os = "linux" ,
773
+ target_os = "redox" ,
774
+ ) ) ] {
775
+ self . sun_len = new_length as u8 ;
776
+ } else {
777
+ self . sun. sun_len = new_length as u8 ;
778
+ }
779
+ } ;
780
+ Ok ( ( ) )
781
+ }
766
782
}
767
783
768
784
impl AsRef < libc:: sockaddr_un > for UnixAddr {
@@ -912,8 +928,30 @@ pub trait SockaddrLike: private::SockaddrLikePriv {
912
928
{
913
929
mem:: size_of :: < Self > ( ) as libc:: socklen_t
914
930
}
931
+
932
+ /// Set the length of this socket address
933
+ ///
934
+ /// This method may only be called on socket addresses whose lenghts are dynamic, and it
935
+ /// returns an error if called on a type whose length is static.
936
+ ///
937
+ /// # Safety
938
+ ///
939
+ /// `new_length` must be a valid length for this type of address. Specifically, reads of that
940
+ /// length from `self` must be valid.
941
+ unsafe fn set_length ( & mut self , new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > ;
915
942
}
916
943
944
+ /// The error returned by [`SockaddrLike::set_length`] on an address whose length is statically
945
+ /// fixed.
946
+ #[ derive( Copy , Clone , Debug ) ]
947
+ pub struct SocketAddressLengthNotDynamic ;
948
+ impl fmt:: Display for SocketAddressLengthNotDynamic {
949
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
950
+ f. write_str ( "Attempted to set length on socket whose length is statically fixed" )
951
+ }
952
+ }
953
+ impl std:: error:: Error for SocketAddressLengthNotDynamic { }
954
+
917
955
impl private:: SockaddrLikePriv for ( ) {
918
956
fn as_mut_ptr ( & mut self ) -> * mut libc:: sockaddr {
919
957
ptr:: null_mut ( )
@@ -946,6 +984,10 @@ impl SockaddrLike for () {
946
984
fn len ( & self ) -> libc:: socklen_t {
947
985
0
948
986
}
987
+
988
+ unsafe fn set_length ( & mut self , _new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > {
989
+ Err ( SocketAddressLengthNotDynamic )
990
+ }
949
991
}
950
992
951
993
/// An IPv4 socket address
@@ -1015,6 +1057,10 @@ impl SockaddrLike for SockaddrIn {
1015
1057
}
1016
1058
Some ( Self ( ptr:: read_unaligned ( addr as * const _ ) ) )
1017
1059
}
1060
+
1061
+ unsafe fn set_length ( & mut self , _new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > {
1062
+ Err ( SocketAddressLengthNotDynamic )
1063
+ }
1018
1064
}
1019
1065
1020
1066
#[ cfg( feature = "net" ) ]
@@ -1134,6 +1180,10 @@ impl SockaddrLike for SockaddrIn6 {
1134
1180
}
1135
1181
Some ( Self ( ptr:: read_unaligned ( addr as * const _ ) ) )
1136
1182
}
1183
+
1184
+ unsafe fn set_length ( & mut self , _new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > {
1185
+ Err ( SocketAddressLengthNotDynamic )
1186
+ }
1137
1187
}
1138
1188
1139
1189
#[ cfg( feature = "net" ) ]
@@ -1361,6 +1411,27 @@ impl SockaddrLike for SockaddrStorage {
1361
1411
None => mem:: size_of_val ( self ) as libc:: socklen_t ,
1362
1412
}
1363
1413
}
1414
+
1415
+ unsafe fn set_length ( & mut self , new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > {
1416
+ match self . as_unix_addr_mut ( ) {
1417
+ Some ( addr) => {
1418
+ cfg_if ! {
1419
+ if #[ cfg( any( target_os = "android" ,
1420
+ target_os = "fuchsia" ,
1421
+ target_os = "illumos" ,
1422
+ target_os = "linux" ,
1423
+ target_os = "redox" ,
1424
+ ) ) ] {
1425
+ addr. sun_len = new_length as u8 ;
1426
+ } else {
1427
+ addr. sun. sun_len = new_length as u8 ;
1428
+ }
1429
+ }
1430
+ Ok ( ( ) )
1431
+ } ,
1432
+ None => Err ( SocketAddressLengthNotDynamic ) ,
1433
+ }
1434
+ }
1364
1435
}
1365
1436
1366
1437
macro_rules! accessors {
@@ -1754,6 +1825,10 @@ pub mod netlink {
1754
1825
}
1755
1826
Some ( Self ( ptr:: read_unaligned ( addr as * const _ ) ) )
1756
1827
}
1828
+
1829
+ unsafe fn set_length ( & mut self , _new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > {
1830
+ Err ( SocketAddressLengthNotDynamic )
1831
+ }
1757
1832
}
1758
1833
1759
1834
impl AsRef < libc:: sockaddr_nl > for NetlinkAddr {
@@ -1803,6 +1878,10 @@ pub mod alg {
1803
1878
}
1804
1879
Some ( Self ( ptr:: read_unaligned ( addr as * const _ ) ) )
1805
1880
}
1881
+
1882
+ unsafe fn set_length ( & mut self , _new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > {
1883
+ Err ( SocketAddressLengthNotDynamic )
1884
+ }
1806
1885
}
1807
1886
1808
1887
impl AsRef < libc:: sockaddr_alg > for AlgAddr {
@@ -1902,7 +1981,7 @@ pub mod sys_control {
1902
1981
use std:: { fmt, mem, ptr} ;
1903
1982
use std:: os:: unix:: io:: RawFd ;
1904
1983
use crate :: { Errno , Result } ;
1905
- use super :: { private, SockaddrLike } ;
1984
+ use super :: { private, SockaddrLike , SocketAddressLengthNotDynamic } ;
1906
1985
1907
1986
// FIXME: Move type into `libc`
1908
1987
#[ repr( C ) ]
@@ -1943,6 +2022,10 @@ pub mod sys_control {
1943
2022
}
1944
2023
Some ( Self ( ptr:: read_unaligned( addr as * const _) ) )
1945
2024
}
2025
+
2026
+ unsafe fn set_length( & mut self , _new_length: usize ) -> std:: result:: Result <( ) , SocketAddressLengthNotDynamic > {
2027
+ Err ( SocketAddressLengthNotDynamic )
2028
+ }
1946
2029
}
1947
2030
1948
2031
impl AsRef <libc:: sockaddr_ctl> for SysControlAddr {
@@ -2007,7 +2090,7 @@ pub mod sys_control {
2007
2090
mod datalink {
2008
2091
feature ! {
2009
2092
#![ feature = "net" ]
2010
- use super :: { fmt, mem, private, ptr, SockaddrLike } ;
2093
+ use super :: { fmt, mem, private, ptr, SockaddrLike , SocketAddressLengthNotDynamic } ;
2011
2094
2012
2095
/// Hardware Address
2013
2096
#[ derive( Clone , Copy , Debug , Eq , Hash , PartialEq ) ]
@@ -2085,6 +2168,10 @@ mod datalink {
2085
2168
}
2086
2169
Some ( Self ( ptr:: read_unaligned( addr as * const _) ) )
2087
2170
}
2171
+
2172
+ unsafe fn set_length( & mut self , _new_length: usize ) -> std:: result:: Result <( ) , SocketAddressLengthNotDynamic > {
2173
+ Err ( SocketAddressLengthNotDynamic )
2174
+ }
2088
2175
}
2089
2176
2090
2177
impl AsRef <libc:: sockaddr_ll> for LinkAddr {
@@ -2110,7 +2197,7 @@ mod datalink {
2110
2197
mod datalink {
2111
2198
feature ! {
2112
2199
#![ feature = "net" ]
2113
- use super :: { fmt, mem, private, ptr, SockaddrLike } ;
2200
+ use super :: { fmt, mem, private, ptr, SockaddrLike , SocketAddressLengthNotDynamic } ;
2114
2201
2115
2202
/// Hardware Address
2116
2203
#[ derive( Clone , Copy , Debug , Eq , Hash , PartialEq ) ]
@@ -2209,6 +2296,10 @@ mod datalink {
2209
2296
}
2210
2297
Some ( Self ( ptr:: read_unaligned( addr as * const _) ) )
2211
2298
}
2299
+
2300
+ unsafe fn set_length( & mut self , _new_length: usize ) -> std:: result:: Result <( ) , SocketAddressLengthNotDynamic > {
2301
+ Err ( SocketAddressLengthNotDynamic )
2302
+ }
2212
2303
}
2213
2304
2214
2305
impl AsRef <libc:: sockaddr_dl> for LinkAddr {
@@ -2257,6 +2348,10 @@ pub mod vsock {
2257
2348
}
2258
2349
Some ( Self ( ptr:: read_unaligned ( addr as * const _ ) ) )
2259
2350
}
2351
+
2352
+ unsafe fn set_length ( & mut self , _new_length : usize ) -> std:: result:: Result < ( ) , SocketAddressLengthNotDynamic > {
2353
+ Err ( SocketAddressLengthNotDynamic )
2354
+ }
2260
2355
}
2261
2356
2262
2357
impl AsRef < libc:: sockaddr_vm > for VsockAddr {
0 commit comments