From 58ff7b88b5ec35d2add422dbc8a5897b4b508c55 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Sun, 14 Apr 2019 20:31:19 +0800 Subject: [PATCH] fix SgxFile seek after the end --- src/libos/src/fs/sgx_impl.rs | 16 +++++++++++++++- src/sgxenv.mk | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/libos/src/fs/sgx_impl.rs b/src/libos/src/fs/sgx_impl.rs index b60c651b..87684676 100644 --- a/src/libos/src/fs/sgx_impl.rs +++ b/src/libos/src/fs/sgx_impl.rs @@ -4,7 +4,7 @@ use rcore_fs_sefs::dev::*; use std::boxed::Box; use std::io::{Read, Seek, SeekFrom, Write}; use std::path::{Path, PathBuf}; -use std::sgxfs::{OpenOptions, remove, SgxFile}; +use std::sgxfs::{remove, OpenOptions, SgxFile}; use std::sync::SgxMutex as Mutex; use std::time::{SystemTime, UNIX_EPOCH}; @@ -80,6 +80,20 @@ impl File for LockedFile { return Ok(0); } let mut file = self.0.lock().unwrap(); + + // SgxFile do not support seek a position after the end. + // So check the size and padding zeros if necessary. + let file_size = file.seek(SeekFrom::End(0)).expect("failed to tell SgxFile") as usize; + if file_size < offset { + static ZEROS: [u8; 0x1000] = [0; 0x1000]; + let mut rest_len = offset - file_size; + while rest_len != 0 { + let l = rest_len.min(0x1000); + let len = file.write(&ZEROS[..l]).expect("failed to write SgxFile"); + rest_len -= len; + } + } + let offset = offset as u64; file.seek(SeekFrom::Start(offset)) .expect("failed to seek SgxFile"); diff --git a/src/sgxenv.mk b/src/sgxenv.mk index f03cf685..d57fb414 100644 --- a/src/sgxenv.mk +++ b/src/sgxenv.mk @@ -38,7 +38,7 @@ else endif RUST_SGX_SDK_DIR := $(PROJECT_DIR)/deps/rust-sgx-sdk -SGX_COMMON_CFLAGS += -I$(RUST_SGX_SDK_DIR)/common/ -I$(RUST_SGX_SDK_DIR)/edl/ +SGX_COMMON_CFLAGS += -I$(RUST_SGX_SDK_DIR)/common/ -I$(RUST_SGX_SDK_DIR)/common/inc/ -I$(RUST_SGX_SDK_DIR)/edl/ ifneq ($(SGX_MODE), HW) Urts_Library_Name := sgx_urts_sim