@@ -198,9 +198,18 @@ fn send(io: &mio::net::UdpSocket, transmits: &[Transmit]) -> io::Result<usize> {
198
198
let mut msgs: [ libc:: mmsghdr ; BATCH_SIZE ] = unsafe { mem:: zeroed ( ) } ;
199
199
let mut iovecs: [ libc:: iovec ; BATCH_SIZE ] = unsafe { mem:: zeroed ( ) } ;
200
200
let mut cmsgs = [ cmsg:: Aligned ( [ 0u8 ; CMSG_LEN ] ) ; BATCH_SIZE ] ;
201
+ let mut addrs: [ MaybeUninit < socket2:: SockAddr > ; BATCH_SIZE ] = unsafe {
202
+ MaybeUninit :: uninit ( ) . assume_init ( )
203
+ } ;
201
204
for ( i, transmit) in transmits. iter ( ) . enumerate ( ) . take ( BATCH_SIZE ) {
205
+ let dest_addr = unsafe {
206
+ std:: ptr:: write ( addrs[ i] . as_mut_ptr ( ) ,
207
+ socket2:: SockAddr :: from ( transmit. destination ) ) ;
208
+ & mut * ( & mut addrs[ i] as * mut _ as * mut _ )
209
+ } ;
202
210
prepare_msg (
203
211
transmit,
212
+ dest_addr,
204
213
& mut msgs[ i] . msg_hdr ,
205
214
& mut iovecs[ i] ,
206
215
& mut cmsgs[ i] ,
@@ -233,7 +242,8 @@ fn send(io: &mio::net::UdpSocket, transmits: &[Transmit]) -> io::Result<usize> {
233
242
let mut ctrl = cmsg:: Aligned ( [ 0u8 ; CMSG_LEN ] ) ;
234
243
let mut sent = 0 ;
235
244
while sent < transmits. len ( ) {
236
- prepare_msg ( & transmits[ sent] , & mut hdr, & mut iov, & mut ctrl) ;
245
+ let addr = socket2:: SockAddr :: from ( transmits[ sent] . destination ) ;
246
+ prepare_msg ( & transmits[ sent] , & addr, & mut hdr, & mut iov, & mut ctrl) ;
237
247
let n = unsafe { libc:: sendmsg ( io. as_raw_fd ( ) , & hdr, 0 ) } ;
238
248
if n == -1 {
239
249
let e = io:: Error :: last_os_error ( ) ;
@@ -340,19 +350,22 @@ fn in_addr(addr: &Ipv4Addr) -> libc::in_addr {
340
350
341
351
fn prepare_msg (
342
352
transmit : & Transmit ,
353
+ dest_addr : & socket2:: SockAddr ,
343
354
hdr : & mut libc:: msghdr ,
344
355
iov : & mut libc:: iovec ,
345
356
ctrl : & mut cmsg:: Aligned < [ u8 ; CMSG_LEN ] > ,
346
357
) {
347
358
iov. iov_base = transmit. contents . as_ptr ( ) as * const _ as * mut _ ;
348
359
iov. iov_len = transmit. contents . len ( ) ;
349
360
350
- let ( name, namelen) = match transmit. destination {
351
- SocketAddr :: V4 ( ref addr) => ( addr as * const _ as _ , mem:: size_of :: < libc:: sockaddr_in > ( ) ) ,
352
- SocketAddr :: V6 ( ref addr) => ( addr as * const _ as _ , mem:: size_of :: < libc:: sockaddr_in6 > ( ) ) ,
353
- } ;
354
- hdr. msg_name = name;
355
- hdr. msg_namelen = namelen as _ ;
361
+ // SAFETY: Casting the pointer to a mutable one is legal,
362
+ // as sendmsg is guaranteed to not alter the mutable pointer.
363
+ // The type is only mutable in the first place because it is reused
364
+ // by recvmsg as well.
365
+ let name = dest_addr. as_ptr ( ) as * mut libc:: c_void ;
366
+ let namelen = dest_addr. len ( ) ;
367
+ hdr. msg_name = name as * mut _ ;
368
+ hdr. msg_namelen = namelen;
356
369
hdr. msg_iov = iov;
357
370
hdr. msg_iovlen = 1 ;
358
371
0 commit comments