|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging-4.12] x86/traps: fix an off-by-one error
commit 2291b9795e69f4ec34c6a997d66a50a9fa014775
Author: Hongyan Xia <hongyxia@xxxxxxxxxx>
AuthorDate: Thu May 7 14:57:35 2020 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu May 7 14:57:35 2020 +0200
x86/traps: fix an off-by-one error
stack++ can go into the next page and unmap_domain_page() will unmap the
wrong one, causing mapcache and memory corruption. Fix.
Signed-off-by: Hongyan Xia <hongyxia@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
master commit: 2e3d87cc734a895ef5b486926274a178836b67a9
master date: 2020-05-05 16:13:44 +0100
---
xen/arch/x86/traps.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 6851f9dbab..3241951805 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -230,6 +230,7 @@ static void compat_show_guest_stack(struct vcpu *v,
int debug_stack_lines)
{
unsigned int i, *stack, addr, mask = STACK_SIZE;
+ void *stack_page = NULL;
stack = (unsigned int *)(unsigned long)regs->esp;
printk("Guest stack trace from esp=%08lx:\n ", (unsigned long)stack);
@@ -252,7 +253,7 @@ static void compat_show_guest_stack(struct vcpu *v,
break;
if ( !vcpu )
{
- stack = do_page_walk(v, (unsigned long)stack);
+ stack_page = stack = do_page_walk(v, (unsigned long)stack);
if ( (unsigned long)stack < PAGE_SIZE )
{
printk("Inaccessible guest memory.\n");
@@ -279,11 +280,10 @@ static void compat_show_guest_stack(struct vcpu *v,
printk(" %08x", addr);
stack++;
}
- if ( mask == PAGE_SIZE )
- {
- BUILD_BUG_ON(PAGE_SIZE == STACK_SIZE);
- unmap_domain_page(stack);
- }
+
+ if ( stack_page )
+ unmap_domain_page(stack_page);
+
if ( i == 0 )
printk("Stack empty.");
printk("\n");
@@ -294,6 +294,7 @@ static void show_guest_stack(struct vcpu *v, const struct
cpu_user_regs *regs)
int i;
unsigned long *stack, addr;
unsigned long mask = STACK_SIZE;
+ void *stack_page = NULL;
/* Avoid HVM as we don't know what the stack looks like. */
if ( is_hvm_vcpu(v) )
@@ -322,7 +323,7 @@ static void show_guest_stack(struct vcpu *v, const struct
cpu_user_regs *regs)
vcpu = maddr_get_owner(read_cr3()) == v->domain ? v : NULL;
if ( !vcpu )
{
- stack = do_page_walk(v, (unsigned long)stack);
+ stack_page = stack = do_page_walk(v, (unsigned long)stack);
if ( (unsigned long)stack < PAGE_SIZE )
{
printk("Inaccessible guest memory.\n");
@@ -349,11 +350,10 @@ static void show_guest_stack(struct vcpu *v, const struct
cpu_user_regs *regs)
printk(" %p", _p(addr));
stack++;
}
- if ( mask == PAGE_SIZE )
- {
- BUILD_BUG_ON(PAGE_SIZE == STACK_SIZE);
- unmap_domain_page(stack);
- }
+
+ if ( stack_page )
+ unmap_domain_page(stack_page);
+
if ( i == 0 )
printk("Stack empty.");
printk("\n");
--
generated by git-patchbot for /home/xen/git/xen.git#staging-4.12
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |