@@ -10,7 +10,7 @@ use crate::net::UCred;
10
10
11
11
use core:: iter:: FusedIterator ;
12
12
use core:: marker:: PhantomData ;
13
- use core:: mem:: { align_of, size_of, size_of_val, take} ;
13
+ use core:: mem:: { align_of, size_of, size_of_val, take, MaybeUninit } ;
14
14
#[ cfg( linux_kernel) ]
15
15
use core:: ptr:: addr_of;
16
16
use core:: { ptr, slice} ;
@@ -24,25 +24,31 @@ use super::{RecvFlags, SendFlags, SocketAddrAny, SocketAddrV4, SocketAddrV6};
24
24
///
25
25
/// Allocate a buffer for a single file descriptor:
26
26
/// ```
27
+ /// # use core::mem::MaybeUninit;
27
28
/// # use rustix::cmsg_space;
28
- /// let mut space = [0; rustix::cmsg_space!(ScmRights(1))];
29
+ /// let mut space = [MaybeUninit::uninit(); rustix::cmsg_space!(ScmRights(1))];
30
+ /// # let _: &[MaybeUninit<u8>] = space.as_slice();
29
31
/// ```
30
32
///
31
33
/// Allocate a buffer for credentials:
32
34
/// ```
33
35
/// # #[cfg(linux_kernel)]
34
36
/// # {
37
+ /// # use core::mem::MaybeUninit;
35
38
/// # use rustix::cmsg_space;
36
- /// let mut space = [0; rustix::cmsg_space!(ScmCredentials(1))];
39
+ /// let mut space = [MaybeUninit::uninit(); rustix::cmsg_space!(ScmCredentials(1))];
40
+ /// # let _: &[MaybeUninit<u8>] = space.as_slice();
37
41
/// # }
38
42
/// ```
39
43
///
40
44
/// Allocate a buffer for two file descriptors and credentials:
41
45
/// ```
42
46
/// # #[cfg(linux_kernel)]
43
47
/// # {
48
+ /// # use core::mem::MaybeUninit;
44
49
/// # use rustix::cmsg_space;
45
- /// let mut space = [0; rustix::cmsg_space!(ScmRights(2), ScmCredentials(1))];
50
+ /// let mut space = [MaybeUninit::uninit(); rustix::cmsg_space!(ScmRights(2), ScmCredentials(1))];
51
+ /// # let _: &[MaybeUninit<u8>] = space.as_slice();
46
52
/// # }
47
53
/// ```
48
54
#[ macro_export]
@@ -164,7 +170,7 @@ pub enum RecvAncillaryMessage<'a> {
164
170
/// [`push`]: SendAncillaryBuffer::push
165
171
pub struct SendAncillaryBuffer < ' buf , ' slice , ' fd > {
166
172
/// Raw byte buffer for messages.
167
- buffer : & ' buf mut [ u8 ] ,
173
+ buffer : & ' buf mut [ MaybeUninit < u8 > ] ,
168
174
169
175
/// The amount of the buffer that is used.
170
176
length : usize ,
@@ -179,6 +185,12 @@ impl<'buf> From<&'buf mut [u8]> for SendAncillaryBuffer<'buf, '_, '_> {
179
185
}
180
186
}
181
187
188
+ impl < ' buf > From < & ' buf mut [ MaybeUninit < u8 > ] > for SendAncillaryBuffer < ' buf , ' _ , ' _ > {
189
+ fn from ( buffer : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
190
+ Self :: new_ ( buffer)
191
+ }
192
+ }
193
+
182
194
impl Default for SendAncillaryBuffer < ' _ , ' _ , ' _ > {
183
195
fn default ( ) -> Self {
184
196
Self {
@@ -231,6 +243,10 @@ impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> {
231
243
/// [`send`]: crate::net::send
232
244
#[ inline]
233
245
pub fn new ( buffer : & ' buf mut [ u8 ] ) -> Self {
246
+ Self :: new_ ( unsafe { core:: mem:: transmute :: < & mut [ u8 ] , & mut [ MaybeUninit < u8 > ] > ( buffer) } )
247
+ }
248
+
249
+ fn new_ ( buffer : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
234
250
Self {
235
251
buffer : align_for_cmsghdr ( buffer) ,
236
252
length : 0 ,
@@ -248,7 +264,7 @@ impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> {
248
264
return core:: ptr:: null_mut ( ) ;
249
265
}
250
266
251
- self . buffer . as_mut_ptr ( )
267
+ self . buffer . as_mut_ptr ( ) . cast ( )
252
268
}
253
269
254
270
/// Returns the length of the message data.
@@ -301,7 +317,7 @@ impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> {
301
317
let buffer = leap ! ( self . buffer. get_mut( ..new_length) ) ;
302
318
303
319
// Fill the new part of the buffer with zeroes.
304
- buffer[ self . length ..new_length] . fill ( 0 ) ;
320
+ buffer[ self . length ..new_length] . fill ( MaybeUninit :: new ( 0 ) ) ;
305
321
self . length = new_length;
306
322
307
323
// Get the last header in the buffer.
@@ -339,7 +355,7 @@ impl<'slice, 'fd> Extend<SendAncillaryMessage<'slice, 'fd>>
339
355
#[ derive( Default ) ]
340
356
pub struct RecvAncillaryBuffer < ' buf > {
341
357
/// Raw byte buffer for messages.
342
- buffer : & ' buf mut [ u8 ] ,
358
+ buffer : & ' buf mut [ MaybeUninit < u8 > ] ,
343
359
344
360
/// The portion of the buffer we've read from already.
345
361
read : usize ,
@@ -354,6 +370,12 @@ impl<'buf> From<&'buf mut [u8]> for RecvAncillaryBuffer<'buf> {
354
370
}
355
371
}
356
372
373
+ impl < ' buf > From < & ' buf mut [ MaybeUninit < u8 > ] > for RecvAncillaryBuffer < ' buf > {
374
+ fn from ( buffer : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
375
+ Self :: new_ ( buffer)
376
+ }
377
+ }
378
+
357
379
impl < ' buf > RecvAncillaryBuffer < ' buf > {
358
380
/// Create a new, empty `RecvAncillaryBuffer` from a raw byte buffer.
359
381
///
@@ -396,6 +418,10 @@ impl<'buf> RecvAncillaryBuffer<'buf> {
396
418
/// [`recv`]: crate::net::recv
397
419
#[ inline]
398
420
pub fn new ( buffer : & ' buf mut [ u8 ] ) -> Self {
421
+ Self :: new_ ( unsafe { core:: mem:: transmute :: < & mut [ u8 ] , & mut [ MaybeUninit < u8 > ] > ( buffer) } )
422
+ }
423
+
424
+ fn new_ ( buffer : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
399
425
Self {
400
426
buffer : align_for_cmsghdr ( buffer) ,
401
427
read : 0 ,
@@ -413,7 +439,7 @@ impl<'buf> RecvAncillaryBuffer<'buf> {
413
439
return core:: ptr:: null_mut ( ) ;
414
440
}
415
441
416
- self . buffer . as_mut_ptr ( )
442
+ self . buffer . as_mut_ptr ( ) . cast ( )
417
443
}
418
444
419
445
/// Returns the length of the message data.
@@ -454,7 +480,7 @@ impl Drop for RecvAncillaryBuffer<'_> {
454
480
/// Return a slice of `buffer` starting at the first `cmsghdr` alignment
455
481
/// boundary.
456
482
#[ inline]
457
- fn align_for_cmsghdr ( buffer : & mut [ u8 ] ) -> & mut [ u8 ] {
483
+ fn align_for_cmsghdr ( buffer : & mut [ MaybeUninit < u8 > ] ) -> & mut [ MaybeUninit < u8 > ] {
458
484
// If the buffer is empty, we won't be writing anything into it, so it
459
485
// doesn't need to be aligned.
460
486
if buffer. is_empty ( ) {
@@ -486,7 +512,9 @@ impl<'buf> AncillaryDrain<'buf> {
486
512
/// The buffer must contain valid message data (or be empty).
487
513
pub unsafe fn parse ( buffer : & ' buf mut [ u8 ] ) -> Self {
488
514
Self {
489
- messages : messages:: Messages :: new ( buffer) ,
515
+ messages : messages:: Messages :: new ( unsafe {
516
+ core:: mem:: transmute :: < & mut [ u8 ] , & mut [ MaybeUninit < u8 > ] > ( buffer)
517
+ } ) ,
490
518
read_and_length : None ,
491
519
}
492
520
}
@@ -920,6 +948,7 @@ mod messages {
920
948
use crate :: backend:: net:: msghdr;
921
949
use core:: iter:: FusedIterator ;
922
950
use core:: marker:: PhantomData ;
951
+ use core:: mem:: MaybeUninit ;
923
952
use core:: ptr:: NonNull ;
924
953
925
954
/// An iterator over the messages in an ancillary buffer.
@@ -933,12 +962,12 @@ mod messages {
933
962
header : Option < NonNull < c:: cmsghdr > > ,
934
963
935
964
/// Capture the original lifetime of the buffer.
936
- _buffer : PhantomData < & ' buf mut [ u8 ] > ,
965
+ _buffer : PhantomData < & ' buf mut [ MaybeUninit < u8 > ] > ,
937
966
}
938
967
939
968
impl < ' buf > Messages < ' buf > {
940
969
/// Create a new iterator over messages from a byte buffer.
941
- pub ( super ) fn new ( buf : & ' buf mut [ u8 ] ) -> Self {
970
+ pub ( super ) fn new ( buf : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
942
971
let msghdr = {
943
972
let mut h = msghdr:: zero_msghdr ( ) ;
944
973
h. msg_control = buf. as_mut_ptr ( ) . cast ( ) ;
0 commit comments