@@ -14,7 +14,7 @@ use crate::net::UCred;
14
14
use core:: fmt;
15
15
use core:: iter:: FusedIterator ;
16
16
use core:: marker:: PhantomData ;
17
- use core:: mem:: { align_of, size_of, size_of_val, take} ;
17
+ use core:: mem:: { align_of, size_of, size_of_val, take, MaybeUninit } ;
18
18
#[ cfg( linux_kernel) ]
19
19
use core:: ptr:: addr_of;
20
20
use core:: { ptr, slice} ;
@@ -28,25 +28,31 @@ use super::{RecvFlags, ReturnFlags, SendFlags, SocketAddrAny};
28
28
///
29
29
/// Allocate a buffer for a single file descriptor:
30
30
/// ```
31
+ /// # use core::mem::MaybeUninit;
31
32
/// # use rustix::cmsg_space;
32
- /// let mut space = [0; rustix::cmsg_space!(ScmRights(1))];
33
+ /// let mut space = [MaybeUninit::uninit(); rustix::cmsg_space!(ScmRights(1))];
34
+ /// # let _: &[MaybeUninit<u8>] = space.as_slice();
33
35
/// ```
34
36
///
35
37
/// Allocate a buffer for credentials:
36
38
/// ```
37
39
/// # #[cfg(linux_kernel)]
38
40
/// # {
41
+ /// # use core::mem::MaybeUninit;
39
42
/// # use rustix::cmsg_space;
40
- /// let mut space = [0; rustix::cmsg_space!(ScmCredentials(1))];
43
+ /// let mut space = [MaybeUninit::uninit(); rustix::cmsg_space!(ScmCredentials(1))];
44
+ /// # let _: &[MaybeUninit<u8>] = space.as_slice();
41
45
/// # }
42
46
/// ```
43
47
///
44
48
/// Allocate a buffer for two file descriptors and credentials:
45
49
/// ```
46
50
/// # #[cfg(linux_kernel)]
47
51
/// # {
52
+ /// # use core::mem::MaybeUninit;
48
53
/// # use rustix::cmsg_space;
49
- /// let mut space = [0; rustix::cmsg_space!(ScmRights(2), ScmCredentials(1))];
54
+ /// let mut space = [MaybeUninit::uninit(); rustix::cmsg_space!(ScmRights(2), ScmCredentials(1))];
55
+ /// # let _: &[MaybeUninit<u8>] = space.as_slice();
50
56
/// # }
51
57
/// ```
52
58
#[ macro_export]
@@ -169,7 +175,7 @@ pub enum RecvAncillaryMessage<'a> {
169
175
/// [`push`]: SendAncillaryBuffer::push
170
176
pub struct SendAncillaryBuffer < ' buf , ' slice , ' fd > {
171
177
/// Raw byte buffer for messages.
172
- buffer : & ' buf mut [ u8 ] ,
178
+ buffer : & ' buf mut [ MaybeUninit < u8 > ] ,
173
179
174
180
/// The amount of the buffer that is used.
175
181
length : usize ,
@@ -178,8 +184,8 @@ pub struct SendAncillaryBuffer<'buf, 'slice, 'fd> {
178
184
_phantom : PhantomData < & ' slice [ BorrowedFd < ' fd > ] > ,
179
185
}
180
186
181
- impl < ' buf > From < & ' buf mut [ u8 ] > for SendAncillaryBuffer < ' buf , ' _ , ' _ > {
182
- fn from ( buffer : & ' buf mut [ u8 ] ) -> Self {
187
+ impl < ' buf > From < & ' buf mut [ MaybeUninit < u8 > ] > for SendAncillaryBuffer < ' buf , ' _ , ' _ > {
188
+ fn from ( buffer : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
183
189
Self :: new ( buffer)
184
190
}
185
191
}
@@ -205,19 +211,21 @@ impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> {
205
211
///
206
212
/// Allocate a buffer for a single file descriptor:
207
213
/// ```
214
+ /// # use core::mem::MaybeUninit;
208
215
/// # use rustix::cmsg_space;
209
216
/// # use rustix::net::SendAncillaryBuffer;
210
- /// let mut space = [0 ; rustix::cmsg_space!(ScmRights(1))];
217
+ /// let mut space = [MaybeUninit::uninit() ; rustix::cmsg_space!(ScmRights(1))];
211
218
/// let mut cmsg_buffer = SendAncillaryBuffer::new(&mut space);
212
219
/// ```
213
220
///
214
221
/// Allocate a buffer for credentials:
215
222
/// ```
216
223
/// # #[cfg(linux_kernel)]
217
224
/// # {
225
+ /// # use core::mem::MaybeUninit;
218
226
/// # use rustix::cmsg_space;
219
227
/// # use rustix::net::SendAncillaryBuffer;
220
- /// let mut space = [0 ; rustix::cmsg_space!(ScmCredentials(1))];
228
+ /// let mut space = [MaybeUninit::uninit() ; rustix::cmsg_space!(ScmCredentials(1))];
221
229
/// let mut cmsg_buffer = SendAncillaryBuffer::new(&mut space);
222
230
/// # }
223
231
/// ```
@@ -226,16 +234,17 @@ impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> {
226
234
/// ```
227
235
/// # #[cfg(linux_kernel)]
228
236
/// # {
237
+ /// # use core::mem::MaybeUninit;
229
238
/// # use rustix::cmsg_space;
230
239
/// # use rustix::net::SendAncillaryBuffer;
231
- /// let mut space = [0 ; rustix::cmsg_space!(ScmRights(2), ScmCredentials(1))];
240
+ /// let mut space = [MaybeUninit::uninit() ; rustix::cmsg_space!(ScmRights(2), ScmCredentials(1))];
232
241
/// let mut cmsg_buffer = SendAncillaryBuffer::new(&mut space);
233
242
/// # }
234
243
/// ```
235
244
///
236
245
/// [`send`]: crate::net::send
237
246
#[ inline]
238
- pub fn new ( buffer : & ' buf mut [ u8 ] ) -> Self {
247
+ pub fn new ( buffer : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
239
248
Self {
240
249
buffer : align_for_cmsghdr ( buffer) ,
241
250
length : 0 ,
@@ -253,7 +262,7 @@ impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> {
253
262
return core:: ptr:: null_mut ( ) ;
254
263
}
255
264
256
- self . buffer . as_mut_ptr ( )
265
+ self . buffer . as_mut_ptr ( ) . cast ( )
257
266
}
258
267
259
268
/// Returns the length of the message data.
@@ -306,7 +315,7 @@ impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> {
306
315
let buffer = leap ! ( self . buffer. get_mut( ..new_length) ) ;
307
316
308
317
// Fill the new part of the buffer with zeroes.
309
- buffer[ self . length ..new_length] . fill ( 0 ) ;
318
+ buffer[ self . length ..new_length] . fill ( MaybeUninit :: new ( 0 ) ) ;
310
319
self . length = new_length;
311
320
312
321
// Get the last header in the buffer.
@@ -344,7 +353,7 @@ impl<'slice, 'fd> Extend<SendAncillaryMessage<'slice, 'fd>>
344
353
#[ derive( Default ) ]
345
354
pub struct RecvAncillaryBuffer < ' buf > {
346
355
/// Raw byte buffer for messages.
347
- buffer : & ' buf mut [ u8 ] ,
356
+ buffer : & ' buf mut [ MaybeUninit < u8 > ] ,
348
357
349
358
/// The portion of the buffer we've read from already.
350
359
read : usize ,
@@ -353,8 +362,8 @@ pub struct RecvAncillaryBuffer<'buf> {
353
362
length : usize ,
354
363
}
355
364
356
- impl < ' buf > From < & ' buf mut [ u8 ] > for RecvAncillaryBuffer < ' buf > {
357
- fn from ( buffer : & ' buf mut [ u8 ] ) -> Self {
365
+ impl < ' buf > From < & ' buf mut [ MaybeUninit < u8 > ] > for RecvAncillaryBuffer < ' buf > {
366
+ fn from ( buffer : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
358
367
Self :: new ( buffer)
359
368
}
360
369
}
@@ -370,19 +379,21 @@ impl<'buf> RecvAncillaryBuffer<'buf> {
370
379
///
371
380
/// Allocate a buffer for a single file descriptor:
372
381
/// ```
382
+ /// # use core::mem::MaybeUninit;
373
383
/// # use rustix::cmsg_space;
374
384
/// # use rustix::net::RecvAncillaryBuffer;
375
- /// let mut space = [0 ; rustix::cmsg_space!(ScmRights(1))];
385
+ /// let mut space = [MaybeUninit::uninit() ; rustix::cmsg_space!(ScmRights(1))];
376
386
/// let mut cmsg_buffer = RecvAncillaryBuffer::new(&mut space);
377
387
/// ```
378
388
///
379
389
/// Allocate a buffer for credentials:
380
390
/// ```
381
391
/// # #[cfg(linux_kernel)]
382
392
/// # {
393
+ /// # use core::mem::MaybeUninit;
383
394
/// # use rustix::cmsg_space;
384
395
/// # use rustix::net::RecvAncillaryBuffer;
385
- /// let mut space = [0 ; rustix::cmsg_space!(ScmCredentials(1))];
396
+ /// let mut space = [MaybeUninit::uninit() ; rustix::cmsg_space!(ScmCredentials(1))];
386
397
/// let mut cmsg_buffer = RecvAncillaryBuffer::new(&mut space);
387
398
/// # }
388
399
/// ```
@@ -391,16 +402,17 @@ impl<'buf> RecvAncillaryBuffer<'buf> {
391
402
/// ```
392
403
/// # #[cfg(linux_kernel)]
393
404
/// # {
405
+ /// # use core::mem::MaybeUninit;
394
406
/// # use rustix::cmsg_space;
395
407
/// # use rustix::net::RecvAncillaryBuffer;
396
- /// let mut space = [0 ; rustix::cmsg_space!(ScmRights(2), ScmCredentials(1))];
408
+ /// let mut space = [MaybeUninit::uninit() ; rustix::cmsg_space!(ScmRights(2), ScmCredentials(1))];
397
409
/// let mut cmsg_buffer = RecvAncillaryBuffer::new(&mut space);
398
410
/// # }
399
411
/// ```
400
412
///
401
413
/// [`recv`]: crate::net::recv
402
414
#[ inline]
403
- pub fn new ( buffer : & ' buf mut [ u8 ] ) -> Self {
415
+ pub fn new ( buffer : & ' buf mut [ MaybeUninit < u8 > ] ) -> Self {
404
416
Self {
405
417
buffer : align_for_cmsghdr ( buffer) ,
406
418
read : 0 ,
@@ -418,7 +430,7 @@ impl<'buf> RecvAncillaryBuffer<'buf> {
418
430
return core:: ptr:: null_mut ( ) ;
419
431
}
420
432
421
- self . buffer . as_mut_ptr ( )
433
+ self . buffer . as_mut_ptr ( ) . cast ( )
422
434
}
423
435
424
436
/// Returns the length of the message data.
@@ -459,7 +471,7 @@ impl Drop for RecvAncillaryBuffer<'_> {
459
471
/// Return a slice of `buffer` starting at the first `cmsghdr` alignment
460
472
/// boundary.
461
473
#[ inline]
462
- fn align_for_cmsghdr ( buffer : & mut [ u8 ] ) -> & mut [ u8 ] {
474
+ fn align_for_cmsghdr ( buffer : & mut [ MaybeUninit < u8 > ] ) -> & mut [ MaybeUninit < u8 > ] {
463
475
// If the buffer is empty, we won't be writing anything into it, so it
464
476
// doesn't need to be aligned.
465
477
if buffer. is_empty ( ) {
@@ -884,6 +896,7 @@ mod messages {
884
896
use crate :: backend:: net:: msghdr;
885
897
use core:: iter:: FusedIterator ;
886
898
use core:: marker:: PhantomData ;
899
+ use core:: mem:: MaybeUninit ;
887
900
use core:: ptr:: NonNull ;
888
901
889
902
/// An iterator over the messages in an ancillary buffer.
@@ -897,15 +910,19 @@ mod messages {
897
910
header : Option < NonNull < c:: cmsghdr > > ,
898
911
899
912
/// Capture the original lifetime of the buffer.
900
- _buffer : PhantomData < & ' buf mut [ u8 ] > ,
913
+ _buffer : PhantomData < & ' buf mut [ MaybeUninit < u8 > ] > ,
901
914
}
902
915
916
+ pub ( super ) trait AllowedMsgBufType { }
917
+ impl AllowedMsgBufType for u8 { }
918
+ impl AllowedMsgBufType for MaybeUninit < u8 > { }
919
+
903
920
impl < ' buf > Messages < ' buf > {
904
921
/// Create a new iterator over messages from a byte buffer.
905
- pub ( super ) fn new ( buf : & ' buf mut [ u8 ] ) -> Self {
922
+ pub ( super ) fn new ( buf : & ' buf mut [ impl AllowedMsgBufType ] ) -> Self {
906
923
let mut msghdr = msghdr:: zero_msghdr ( ) ;
907
924
msghdr. msg_control = buf. as_mut_ptr ( ) . cast ( ) ;
908
- msghdr. msg_controllen = buf. len ( ) . try_into ( ) . unwrap ( ) ;
925
+ msghdr. msg_controllen = buf. len ( ) . try_into ( ) . expect ( "buffer too large for msghdr" ) ;
909
926
910
927
// Get the first header.
911
928
let header = NonNull :: new ( unsafe { c:: CMSG_FIRSTHDR ( & msghdr) } ) ;
0 commit comments