[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] fix mapping bugs in map_domain_va in xc_ptrace.c
ChangeSet 1.1332, 2005/03/20 15:07:47+00:00, iap10@xxxxxxxxxxxxxxxxxxxx fix mapping bugs in map_domain_va in xc_ptrace.c map pages RO Signed-off-by: Kip Macy <kmacy@xxxxxxxxxxx> Signed-off-by: ian@xxxxxxxxxxxxx xc_ptrace.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-) diff -Nru a/tools/libxc/xc_ptrace.c b/tools/libxc/xc_ptrace.c --- a/tools/libxc/xc_ptrace.c 2005-03-21 11:03:13 -05:00 +++ b/tools/libxc/xc_ptrace.c 2005-03-21 11:03:13 -05:00 @@ -123,7 +123,7 @@ /* --------------------- */ static void * -map_domain_va(unsigned long domid, void * guest_va) +map_domain_va(unsigned long domid, void * guest_va, int perm) { unsigned long pde, page; unsigned long va = (unsigned long)guest_va; @@ -134,6 +134,8 @@ static unsigned long *pde_virt; static unsigned long page_phys; static unsigned long *page_virt; + + static int prev_perm; if (!regs_valid) { int retval = xc_domain_getfullinfo(xc_handle, domid, 0, NULL, &ctxt); @@ -166,17 +168,19 @@ } if ((page = pde_virt[vtopti(va)]) == 0) goto error_out; - if (page != page_phys) + if (page != page_phys || perm != prev_perm) { page_phys = page; if (page_virt) munmap(page_virt, PAGE_SIZE); if ((page_virt = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, - PROT_READ|PROT_WRITE, + perm, page_phys >> PAGE_SHIFT)) == NULL) { printf("cr3 %lx pde %lx page %lx pti %lx\n", cr3, pde, page, vtopti(va)); + page_phys = 0; goto error_out; } + prev_perm = perm; } return (void *)(((unsigned long)page_virt) | (va & BSD_PAGE_MASK)); @@ -247,17 +251,21 @@ switch (request) { case PTRACE_PEEKTEXT: case PTRACE_PEEKDATA: + if ((guest_va = (unsigned long *)map_domain_va(pid, addr, PROT_READ)) == NULL) { + status = EFAULT; + goto done; + } + + retval = *guest_va; + break; case PTRACE_POKETEXT: case PTRACE_POKEDATA: - if ((guest_va = (unsigned long *)map_domain_va(pid, addr)) == NULL) { + if ((guest_va = (unsigned long *)map_domain_va(pid, addr, PROT_READ|PROT_WRITE)) == NULL) { status = EFAULT; goto done; } - if (request == PTRACE_PEEKTEXT || request == PTRACE_PEEKDATA) - retval = *guest_va; - else - *guest_va = (unsigned long)data; + *guest_va = (unsigned long)data; break; case PTRACE_GETREGS: case PTRACE_GETFPREGS: ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxxx https://lists.sourceforge.net/lists/listinfo/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |