@@ -2,11 +2,11 @@ use super::{sockaddr_un, SocketAddr};
2
2
use crate :: convert:: TryFrom ;
3
3
use crate :: io:: { self , IoSlice , IoSliceMut } ;
4
4
use crate :: marker:: PhantomData ;
5
- use crate :: mem:: { size_of, zeroed} ;
5
+ use crate :: mem:: { size_of, zeroed, MaybeUninit } ;
6
6
use crate :: os:: unix:: io:: RawFd ;
7
7
use crate :: path:: Path ;
8
8
use crate :: ptr:: { eq, read_unaligned} ;
9
- use crate :: slice:: from_raw_parts ;
9
+ use crate :: slice;
10
10
use crate :: sys:: net:: Socket ;
11
11
12
12
// FIXME(#43348): Make libc adapt #[doc(cfg(...))] so we don't need these fake definitions here?
@@ -79,7 +79,7 @@ pub(super) fn send_vectored_with_ancillary_to(
79
79
}
80
80
81
81
fn add_to_ancillary_data < T > (
82
- buffer : & mut [ u8 ] ,
82
+ buffer : & mut [ MaybeUninit < u8 > ] ,
83
83
length : & mut usize ,
84
84
source : & [ T ] ,
85
85
cmsg_level : libc:: c_int ,
@@ -108,7 +108,7 @@ fn add_to_ancillary_data<T>(
108
108
return false ;
109
109
}
110
110
111
- buffer[ * length..new_length] . fill ( 0 ) ;
111
+ buffer[ * length..new_length] . fill ( MaybeUninit :: new ( 0 ) ) ;
112
112
113
113
* length = new_length;
114
114
@@ -309,7 +309,7 @@ impl<'a> AncillaryData<'a> {
309
309
let cmsg_len_zero = libc:: CMSG_LEN ( 0 ) as usize ;
310
310
let data_len = ( * cmsg) . cmsg_len as usize - cmsg_len_zero;
311
311
let data = libc:: CMSG_DATA ( cmsg) . cast ( ) ;
312
- let data = from_raw_parts ( data, data_len) ;
312
+ let data = slice :: from_raw_parts ( data, data_len) ;
313
313
314
314
match ( * cmsg) . cmsg_level {
315
315
libc:: SOL_SOCKET => match ( * cmsg) . cmsg_type {
@@ -401,7 +401,7 @@ impl<'a> Iterator for Messages<'a> {
401
401
#[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
402
402
#[ derive( Debug ) ]
403
403
pub struct SocketAncillary < ' a > {
404
- buffer : & ' a mut [ u8 ] ,
404
+ buffer : & ' a mut [ MaybeUninit < u8 > ] ,
405
405
length : usize ,
406
406
truncated : bool ,
407
407
}
@@ -420,6 +420,23 @@ impl<'a> SocketAncillary<'a> {
420
420
/// ```
421
421
#[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
422
422
pub fn new ( buffer : & ' a mut [ u8 ] ) -> Self {
423
+ let buffer = unsafe { slice:: from_raw_parts_mut ( buffer. as_mut_ptr ( ) . cast ( ) , buffer. len ( ) ) } ;
424
+ Self :: new_uninit ( buffer)
425
+ }
426
+
427
+ /// Create an ancillary data with an uninitialized buffer.
428
+ ///
429
+ /// # Example
430
+ ///
431
+ /// ```no_run
432
+ /// # #![allow(unused_mut)]
433
+ /// #![feature(unix_socket_ancillary_data, new_uninit)]
434
+ /// use std::os::unix::net::SocketAncillary;
435
+ /// let mut ancillary_buffer = Box::new_uninit_slice(128);
436
+ /// let mut ancillary = SocketAncillary::new_uninit(&mut ancillary_buffer[..]);
437
+ /// ```
438
+ #[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
439
+ pub fn new_uninit ( buffer : & ' a mut [ MaybeUninit < u8 > ] ) -> Self {
423
440
SocketAncillary { buffer, length : 0 , truncated : false }
424
441
}
425
442
@@ -432,14 +449,14 @@ impl<'a> SocketAncillary<'a> {
432
449
/// Returns the raw ancillary data as byte slice.
433
450
#[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
434
451
pub fn data ( & self ) -> & [ u8 ] {
435
- & self . buffer [ ..self . length ]
452
+ unsafe { MaybeUninit :: slice_assume_init_ref ( & self . buffer [ ..self . length ] ) }
436
453
}
437
454
438
455
/// Returns the entire buffer, including unused capacity.
439
456
///
440
457
/// Use [`data()`](Self::data) if you are only interested in the used portion of the buffer.
441
458
#[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
442
- pub fn buffer ( & self ) -> & [ u8 ] {
459
+ pub fn buffer ( & self ) -> & [ MaybeUninit < u8 > ] {
443
460
self . buffer
444
461
}
445
462
@@ -453,7 +470,7 @@ impl<'a> SocketAncillary<'a> {
453
470
/// and you must call [`set_len()`](Self::set_len) after changing
454
471
/// the buffer contents to update the internal bookkeeping.
455
472
#[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
456
- pub unsafe fn buffer_mut ( & mut self ) -> & mut [ u8 ] {
473
+ pub unsafe fn buffer_mut ( & mut self ) -> & mut [ MaybeUninit < u8 > ] {
457
474
self . buffer
458
475
}
459
476
@@ -486,7 +503,7 @@ impl<'a> SocketAncillary<'a> {
486
503
/// Returns the iterator of the control messages.
487
504
#[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
488
505
pub fn messages ( & self ) -> Messages < ' _ > {
489
- Messages { buffer : & self . buffer [ .. self . length ] , current : None }
506
+ Messages { buffer : self . data ( ) , current : None }
490
507
}
491
508
492
509
/// Is `true` if during a recv operation the ancillary was truncated.
0 commit comments