Skip to content

Commit

Permalink
fix the issue that s_enclave_elrange_map destructor is invalid
Browse files Browse the repository at this point in the history
which is reported from intel#818

Signed-off-by: junjungu <[email protected]>
  • Loading branch information
JunjunGu1 authored and lzha101 committed May 16, 2022
1 parent 508b5ee commit 2eed93a
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 65 deletions.
47 changes: 8 additions & 39 deletions psw/enclave_common/sgx_enclave_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ static std::map<void*, int> s_hfile; //enclave file handles for drive
static std::map<void*, size_t> s_enclave_size;
static std::map<void*, bool> s_enclave_init;
static std::map<void*, sgx_attributes_t> s_secs_attr;
static std::map<void *, enclave_elrange_t*>s_enclave_elrange_map;
static std::map<void *, enclave_elrange_t>s_enclave_elrange_map;

typedef struct _mem_region_t {
void* addr;
Expand Down Expand Up @@ -177,9 +177,9 @@ static bool get_elrange_from_base_address(void* base_address, enclave_elrange_t*
{
if(enclave_elrange != NULL)
{
enclave_elrange->elrange_size = s_enclave_elrange_map[base_address]->elrange_size;
enclave_elrange->elrange_start_address = s_enclave_elrange_map[base_address]->elrange_start_address;
enclave_elrange->enclave_image_address = s_enclave_elrange_map[base_address]->enclave_image_address;
enclave_elrange->elrange_size = s_enclave_elrange_map[base_address].elrange_size;
enclave_elrange->elrange_start_address = s_enclave_elrange_map[base_address].elrange_start_address;
enclave_elrange->enclave_image_address = s_enclave_elrange_map[base_address].enclave_image_address;
}
return true;
}
Expand Down Expand Up @@ -235,20 +235,10 @@ static void close_sofile(void)
}


static void release_enclave_elrange_map()
{
for (auto &res:s_enclave_elrange_map)
{
auto elrange = res.second;
delete elrange;
elrange = NULL;
}
}
static void __attribute__((destructor)) enclave_fini(void)
{
close_device();
close_sofile();
release_enclave_elrange_map();
}

static uint32_t error_driver2api(int driver_error, int err_no)
Expand Down Expand Up @@ -788,24 +778,9 @@ extern "C" void* COMM_API enclave_create_ex(
s_enclave_mem_region[enclave_base].prot = 0;
if(enclave_elrange != NULL)
{
enclave_elrange_t *tmp_enclave_elrange = new(std::nothrow) enclave_elrange_t;
if (tmp_enclave_elrange == NULL)
{
if (enclave_error)
{
*enclave_error = ENCLAVE_OUT_OF_MEMORY;
}

//if in-kernel driver then close the file handle
if (s_driver_type == SGX_DRIVER_IN_KERNEL)
{
close_file(&hdevice_temp);
}
munmap(enclave_base, virtual_size);
return NULL;
}
memset(tmp_enclave_elrange, 0, sizeof(enclave_elrange_t));
if (memcpy_s(tmp_enclave_elrange, sizeof(enclave_elrange_t), enclave_elrange, sizeof(enclave_elrange_t)))
enclave_elrange_t tmp_enclave_elrange;
memset(&tmp_enclave_elrange, 0, sizeof(enclave_elrange_t));
if (memcpy_s(&tmp_enclave_elrange, sizeof(enclave_elrange_t), enclave_elrange, sizeof(enclave_elrange_t)))
{
if (enclave_error)
{
Expand Down Expand Up @@ -1285,13 +1260,7 @@ extern "C" bool COMM_API enclave_delete(

if(s_enclave_elrange_map.count(base_address) != 0)
{
enclave_elrange_t *enclave_elrange = s_enclave_elrange_map[base_address];
if (enclave_elrange != NULL)
{
s_enclave_elrange_map.erase(base_address);
delete enclave_elrange;
enclave_elrange = NULL;
}
s_enclave_elrange_map.erase(base_address);
}
}

Expand Down
34 changes: 8 additions & 26 deletions sdk/simulation/urtssim/enclave_creator_sim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,26 +75,16 @@ static void cleanup_openssl(void)


static Mutex s_enclave_info_mutex;
static std::map<void *, enclave_elrange_t*>s_enclave_elrange_map;
static std::map<void *, enclave_elrange_t>s_enclave_elrange_map;

__attribute__((destructor))
static void enclave_elrange_cleanup(void)
{
for (auto &res:s_enclave_elrange_map)
{
auto elrange = res.second;
delete elrange;
elrange = NULL;
}
}

extern "C" bool get_elrange_start_address(void* base_address, uint64_t &elrange_start_address)
{
LockGuard lock(&s_enclave_info_mutex);
bool ret = false;
if(s_enclave_elrange_map.count(base_address) != 0)
{
elrange_start_address = s_enclave_elrange_map[base_address]->elrange_start_address;
elrange_start_address = s_enclave_elrange_map[base_address].elrange_start_address;
ret = true;
}
return ret;
Expand All @@ -118,30 +108,22 @@ int EnclaveCreatorSim::create_enclave(secs_t *secs, sgx_enclave_id_t *enclave_id
LockGuard lock(&s_enclave_info_mutex);
if (s_enclave_elrange_map.count(base_address) != 0)
{
enclave_elrange_t *enclave_elrange = s_enclave_elrange_map[base_address];
if (enclave_elrange == NULL)
{
return SGX_ERROR_UNEXPECTED;
}
enclave_elrange_t enclave_elrange = s_enclave_elrange_map[base_address];

if (memcpy_s(enclave_elrange, sizeof(enclave_elrange_t), tmp_enclave_elrange, sizeof(enclave_elrange_t)))
if (memcpy_s(&enclave_elrange, sizeof(enclave_elrange_t), tmp_enclave_elrange, sizeof(enclave_elrange_t)))
{
return SGX_ERROR_UNEXPECTED;
}
}
else
{
enclave_elrange_t *enclave_elrange = new(std::nothrow) enclave_elrange_t;
if (enclave_elrange == NULL)
{
return SGX_ERROR_OUT_OF_MEMORY;
}
memset(enclave_elrange, 0, sizeof(enclave_elrange_t));
if (memcpy_s(enclave_elrange, sizeof(enclave_elrange_t), tmp_enclave_elrange, sizeof(enclave_elrange_t)))
enclave_elrange_t enclave_elrange;
memset(&enclave_elrange, 0, sizeof(enclave_elrange_t));
if (memcpy_s(&enclave_elrange, sizeof(enclave_elrange_t), tmp_enclave_elrange, sizeof(enclave_elrange_t)))
{
return SGX_ERROR_UNEXPECTED;
}
s_enclave_elrange_map[base_address] = enclave_elrange;
s_enclave_elrange_map[base_address] = enclave_elrange;
}
}
return ::create_enclave(secs, enclave_id, start_addr);
Expand Down

0 comments on commit 2eed93a

Please sign in to comment.