@@ -6,7 +6,7 @@ use super::super::mem::{is_enclave_range, is_user_range};
6
6
use crate :: arch:: asm;
7
7
use crate :: cell:: UnsafeCell ;
8
8
use crate :: convert:: TryInto ;
9
- use crate :: mem:: { self , ManuallyDrop } ;
9
+ use crate :: mem:: { self , ManuallyDrop , MaybeUninit } ;
10
10
use crate :: ops:: { CoerceUnsized , Deref , DerefMut , Index , IndexMut } ;
11
11
use crate :: pin:: PinCoerceUnsized ;
12
12
use crate :: ptr:: { self , NonNull } ;
@@ -651,13 +651,29 @@ where
651
651
/// the source. This can happen for dynamically-sized types such as slices.
652
652
pub fn copy_to_enclave_vec ( & self , dest : & mut Vec < T > ) {
653
653
if let Some ( missing) = self . len ( ) . checked_sub ( dest. capacity ( ) ) {
654
- dest. reserve ( missing)
654
+ dest. reserve ( missing) ;
655
655
}
656
656
// SAFETY: We reserve enough space above.
657
657
unsafe { dest. set_len ( self . len ( ) ) } ;
658
658
self . copy_to_enclave ( & mut dest[ ..] ) ;
659
659
}
660
660
661
+ /// Copies the value from user memory and place it into `dest`.
662
+ ///
663
+ /// # Panics
664
+ /// This function panics if the destination doesn't have the same length as
665
+ /// the source.
666
+ pub fn copy_to_enclave_uninit ( & self , dest : & mut [ MaybeUninit < T > ] ) {
667
+ unsafe {
668
+ assert_eq ! ( self . len( ) , dest. len( ) ) ;
669
+ copy_from_userspace (
670
+ self . 0 . get ( ) as * const [ T ] as * const u8 ,
671
+ dest. as_mut_ptr ( ) as * mut u8 ,
672
+ mem:: size_of_val ( dest) ,
673
+ ) ;
674
+ }
675
+ }
676
+
661
677
/// Copies the value from user memory into a vector in enclave memory.
662
678
pub fn to_enclave ( & self ) -> Vec < T > {
663
679
let mut ret = Vec :: with_capacity ( self . len ( ) ) ;
0 commit comments