mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/shadow: fix refcount overflow check
Commitc385d27079("x86 shadow: for multi-page shadows, explicitly track the first page") reduced the refcount width to 25, without adjusting the overflow check. Eliminate the disconnect by using a manifest constant. Interestingly, up to commit047782fa01("Out-of-sync L1 shadows: OOS snapshot") the refcount was 27 bits wide, yet the check was already using 26. This is XSA-249. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: George Dunlap <george.dunlap@citrix.com> Reviewed-by: Tim Deegan <tim@xen.org> master commit:54e2292e8dmaster date: 2017-12-12 14:29:13 +0100
This commit is contained in:
1 parent
ab5ca36994
commit
c8fad5e035
2 files changed
+3
-2
No files matched your search
@@ -524,7 +524,7 @@ static inline int sh_get_ref(struct vcpu *v, mfn_t smfn, paddr_t entry_pa)
|
||||
x = sp->u.sh.count;
|
||||
nx = x + 1;
|
||||
|
||||
if ( unlikely(nx >= 1U<<26) )
|
||||
if ( unlikely(nx >= (1U << PAGE_SH_REFCOUNT_WIDTH)) )
|
||||
{
|
||||
SHADOW_PRINTK("shadow ref overflow, gmfn=%lx smfn=%lx\n",
|
||||
__backpointer(sp), mfn_x(smfn));
|
||||
|
||||
@@ -77,7 +77,8 @@ struct page_info
|
||||
unsigned long type:5; /* What kind of shadow is this? */
|
||||
unsigned long pinned:1; /* Is the shadow pinned? */
|
||||
unsigned long head:1; /* Is this the first page of the shadow? */
|
||||
unsigned long count:25; /* Reference count */
|
||||
#define PAGE_SH_REFCOUNT_WIDTH 25
|
||||
unsigned long count:PAGE_SH_REFCOUNT_WIDTH; /* Reference count */
|
||||
} sh;
|
||||
|
||||
/* Page is on a free list: ((count_info & PGC_count_mask) == 0). */
|
||||
|
||||