about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorJethro Beekman <jethro@fortanix.com>2019-02-05 16:19:05 +0530
committerJethro Beekman <jethro@fortanix.com>2019-02-05 16:19:05 +0530
commit4c8c0fc1e2145b520ef31d1bf5e4d3fa1050c579 (patch)
tree68f806b3d510ed824444521170753029aa88fef7 /src/libstd
parent147311c5fc62537da8eb9c6f69536bec6719d534 (diff)
downloadrust-4c8c0fc1e2145b520ef31d1bf5e4d3fa1050c579.tar.gz
rust-4c8c0fc1e2145b520ef31d1bf5e4d3fa1050c579.zip
SGX target: handle empty user buffers correctly
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/sys/sgx/abi/usercalls/alloc.rs7
-rw-r--r--src/libstd/sys/sgx/abi/usercalls/mod.rs3
2 files changed, 8 insertions, 2 deletions
diff --git a/src/libstd/sys/sgx/abi/usercalls/alloc.rs b/src/libstd/sys/sgx/abi/usercalls/alloc.rs
index 8d0013a235a..2efbaa9b148 100644
--- a/src/libstd/sys/sgx/abi/usercalls/alloc.rs
+++ b/src/libstd/sys/sgx/abi/usercalls/alloc.rs
@@ -537,7 +537,12 @@ impl UserRef<super::raw::ByteBuffer> {
     pub fn copy_user_buffer(&self) -> Vec<u8> {
         unsafe {
             let buf = self.to_enclave();
-            User::from_raw_parts(buf.data as _, buf.len).to_enclave()
+            if buf.len > 0 {
+                User::from_raw_parts(buf.data as _, buf.len).to_enclave()
+            } else {
+                // Mustn't look at `data` or call `free` if `len` is `0`.
+                Vec::with_capacity(0)
+            }
         }
     }
 }
diff --git a/src/libstd/sys/sgx/abi/usercalls/mod.rs b/src/libstd/sys/sgx/abi/usercalls/mod.rs
index 58903761ebe..511d6e9e927 100644
--- a/src/libstd/sys/sgx/abi/usercalls/mod.rs
+++ b/src/libstd/sys/sgx/abi/usercalls/mod.rs
@@ -22,7 +22,8 @@ pub fn read(fd: Fd, buf: &mut [u8]) -> IoResult<usize> {
 #[unstable(feature = "sgx_platform", issue = "56975")]
 pub fn read_alloc(fd: Fd) -> IoResult<Vec<u8>> {
     unsafe {
-        let mut userbuf = alloc::User::<ByteBuffer>::uninitialized();
+        let userbuf = ByteBuffer { data: ::ptr::null_mut(), len: 0 };
+        let mut userbuf = alloc::User::new_from_enclave(&userbuf);
         raw::read_alloc(fd, userbuf.as_raw_mut_ptr()).from_sgx_result()?;
         Ok(userbuf.copy_user_buffer())
     }