Unverified Commit f470ef88 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!4991 CVE-2023-52568

Merge Pull Request from: @ci-robot 
 
PR sync from: Chen Ridong <chenridong@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/GJ2X4H4QIKOF32GP2FUF5WNXNPQ45S2D/ 
*** BLURB HERE ***

Haitao Huang (1):
  x86/sgx: Resolves SECS reclaim vs. page fault for EAUG race


-- 
2.34.1
 
https://gitee.com/src-openeuler/kernel/issues/I95ATJ 
 
Link:https://gitee.com/openeuler/kernel/pulls/4991

 

Reviewed-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents a14ce116 1a652da7
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -235,6 +235,21 @@ static struct sgx_epc_page *sgx_encl_eldu(struct sgx_encl_page *encl_page,
	return epc_page;
}

/*
 * Ensure the SECS page is not swapped out.  Must be called with encl->lock
 * to protect the enclave states including SECS and ensure the SECS page is
 * not swapped out again while being used.
 */
static struct sgx_epc_page *sgx_encl_load_secs(struct sgx_encl *encl)
{
	struct sgx_epc_page *epc_page = encl->secs.epc_page;

	if (!epc_page)
		epc_page = sgx_encl_eldu(&encl->secs, NULL);

	return epc_page;
}

static struct sgx_encl_page *__sgx_encl_load_page(struct sgx_encl *encl,
						  struct sgx_encl_page *entry)
{
@@ -248,11 +263,9 @@ static struct sgx_encl_page *__sgx_encl_load_page(struct sgx_encl *encl,
		return entry;
	}

	if (!(encl->secs.epc_page)) {
		epc_page = sgx_encl_eldu(&encl->secs, NULL);
	epc_page = sgx_encl_load_secs(encl);
	if (IS_ERR(epc_page))
		return ERR_CAST(epc_page);
	}

	epc_page = sgx_encl_eldu(entry, encl->secs.epc_page);
	if (IS_ERR(epc_page))
@@ -339,6 +352,13 @@ static vm_fault_t sgx_encl_eaug_page(struct vm_area_struct *vma,

	mutex_lock(&encl->lock);

	epc_page = sgx_encl_load_secs(encl);
	if (IS_ERR(epc_page)) {
		if (PTR_ERR(epc_page) == -EBUSY)
			vmret = VM_FAULT_NOPAGE;
		goto err_out_unlock;
	}

	epc_page = sgx_alloc_epc_page(encl_page, false);
	if (IS_ERR(epc_page)) {
		if (PTR_ERR(epc_page) == -EBUSY)