[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] P2M: Don't try to free the existing PTE if we can't allocate a new table
On Sat, Jul 26, 2025 at 01:26:07PM +0100, Julien Grall wrote: > From: Julien Grall <jgrall@xxxxxxxxxx> > > When we can't split a superpage (on Arm p2m_split_superpage() returns false, > on x86 ept_split_superpage() returns 0), the caller is expected to clean > any PTE that may have been allocated. However, when we can't allocate > the page-tables 'entry' (arm) / 'ept_entry' still points to a live PTE. > So we will end up to free a PTE that is still used. > > In practice for: > * x86: We don't do any refcounting for 2MB/1GB mappings. So this is > harmless > * arm: We do refcounting for 2MB mapping (not for 1GB ones). This is > only used for static memory. > > So there is a security issue on Arm but this doesn't meet the criteria > for an XSA (static memory is not security supported). > > Solve the issue by clearing the PTE if we can't allocate the table. > > Reported-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> > Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx> > > ---- > > I decided to not split the patch in two as the issue for x86 and > arm is the same. But I am happy to split if this is preferred. > --- > xen/arch/arm/mmu/p2m.c | 8 ++++++++ > xen/arch/x86/mm/p2m-ept.c | 9 +++++++++ > 2 files changed, 17 insertions(+) > > diff --git a/xen/arch/arm/mmu/p2m.c b/xen/arch/arm/mmu/p2m.c > index 51abf3504fcf..9a1fb44a0204 100644 > --- a/xen/arch/arm/mmu/p2m.c > +++ b/xen/arch/arm/mmu/p2m.c > @@ -888,7 +888,15 @@ static bool p2m_split_superpage(struct p2m_domain *p2m, > lpae_t *entry, > > page = p2m_alloc_page(p2m->domain); > if ( !page ) > + { > + /* > + * The caller is in charge to free the sub-tree. So tell the ^^^ Looks like the "So tell the" can be dropped from the commentary. Same comment for the p2m-ept.c below. > + * As we didn't manage to allocate anything, just tell the > + * caller there is nothing to free by invalidating the PTE. > + */ > + memset(entry, 0, sizeof(*entry)); > return false; > + } > > page_list_add(page, &p2m->pages); > table = __map_domain_page(page); > diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c > index 62fc8e50689f..1efac27835d2 100644 > --- a/xen/arch/x86/mm/p2m-ept.c > +++ b/xen/arch/x86/mm/p2m-ept.c > @@ -261,7 +261,16 @@ static bool ept_split_super_page( > > table = ept_set_middle_entry(p2m, &new_ept); > if ( !table ) > + { > + /* > + * The caller is in charge to free the sub-tree. So tell the > + * As we didn't manage to allocate anything, just tell the > + * caller there is nothing to free by invalidating the PTE. > + */ > + memset(ept_entry, 0, sizeof(*ept_entry)); > + > return 0; > + } > > trunk = 1UL << ((level - 1) * EPT_TABLE_ORDER); > > -- > 2.47.3 > >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |