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