x86/PoD: handle intermediate page orders in p2m_pod_cache_add()

p2m_pod_decrease_reservation() may pass pages to the function which
aren't 4k, 2M, or 1G. Handle all intermediate orders as well, to avoid
hitting the BUG() at the switch() statement's "default" case.

This is CVE-2021-28708 / part of XSA-388.

Fixes: 3c352011c0 ("x86/PoD: shorten certain operations on higher order ranges")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
Jan Beulich authored and Ian Jackson committed 2021-11-22 12:27:30 +00:00
1 parent 182c737b9b
commit 8ec13f68e0
1 file changed
+5 -7
+5 -7
View File
@@ -113,15 +113,13 @@ p2m_pod_cache_add(struct p2m_domain *p2m,
/* Then add to the appropriate populate-on-demand list. */
switch ( order )
{
case PAGE_ORDER_1G:
for ( i = 0; i < (1UL << PAGE_ORDER_1G); i += 1UL << PAGE_ORDER_2M )
case PAGE_ORDER_2M ... PAGE_ORDER_1G:
for ( i = 0; i < (1UL << order); i += 1UL << PAGE_ORDER_2M )
page_list_add_tail(page + i, &p2m->pod.super);
break;
case PAGE_ORDER_2M:
page_list_add_tail(page, &p2m->pod.super);
break;
case PAGE_ORDER_4K:
page_list_add_tail(page, &p2m->pod.single);
case PAGE_ORDER_4K ... PAGE_ORDER_2M - 1:
for ( i = 0; i < (1UL << order); i += 1UL << PAGE_ORDER_4K )
page_list_add_tail(page + i, &p2m->pod.single);
break;
default:
BUG();
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.