]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Fix segfault in mmio subpage handling code.
authorGleb Natapov <gleb@redhat.com>
Thu, 29 Jul 2010 07:41:45 +0000 (10:41 +0300)
committerBlue Swirl <blauwirbel@gmail.com>
Sat, 28 Aug 2010 08:47:23 +0000 (08:47 +0000)
It is possible that subpage mmio is registered over existing memory
page. When this happens "memory" will have real memory address and not
index into io_mem array so next access to the page will generate
segfault. It is uncommon to have some part of a page to be accessed as
memory and some as mmio, but qemu shouldn't crash even when guest does
stupid things. So lets just pretend that the rest of the page is
unassigned if guest configure part of the memory page as mmio.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
exec.c

diff --git a/exec.c b/exec.c
index 82bfffcb8bfa54609ed4d39d3e336dcf9697c5b2..380dab50bea33a2dc7ca0c4d68eabb1dd0f8864e 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -3293,6 +3293,8 @@ static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
     printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__,
            mmio, start, end, idx, eidx, memory);
 #endif
+    if ((memory & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
+        memory = IO_MEM_UNASSIGNED;
     memory = (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
     for (; idx <= eidx; idx++) {
         mmio->sub_io_index[idx] = memory;