]> Zhao Yanbai Git Server - minix.git/commitdiff
VM bugfix & regression test 02/1202/4
authorBen Gras <ben@minix3.org>
Wed, 8 Jan 2014 16:43:19 +0000 (17:43 +0100)
committerGerrit Code Review <gerrit@gerrit>
Thu, 9 Jan 2014 17:28:11 +0000 (18:28 +0100)
The bug in the offset correction code for the 'shrink region from
below' case can easily case an assert(foundregion->offset == offset)
to trigger (if the blocks are touched afterwards, e.g. on fork())
as the offsets become wrong. This commit is a fix & regression test.

Change-Id: I28ed403e3891362a2dea674a49e786d3450d2983

servers/vm/region.c
test/test74.c

index 9728bdd1c6a34e0587850690e92f66eba499e7f8..7450fd844d496a704dec30af380bf0b36f488bbb 100644 (file)
@@ -1102,8 +1102,7 @@ int map_unmap_region(struct vmproc *vmp, struct vir_region *r,
                region_remove(&vmp->vm_regions_avl, r->vaddr);
 
                USE(r,
-               r->vaddr += len;
-               r->length -= len;);
+               r->vaddr += len;);
 
                remslots = phys_slot(r->length);
 
@@ -1113,15 +1112,17 @@ int map_unmap_region(struct vmproc *vmp, struct vir_region *r,
                 * point to the same addresses, make them shrink by the
                 * same amount.
                 */
-               for(voffset = offset; voffset < r->length;
+               for(voffset = len; voffset < r->length;
                        voffset += VM_PAGE_SIZE) {
                        if(!(pr = physblock_get(r, voffset))) continue;
                        assert(pr->offset >= offset);
+                       assert(pr->offset >= len);
                        USE(pr, pr->offset -= len;);
                }
                if(remslots)
                        memmove(r->physblocks, r->physblocks + freeslots,
                                remslots * sizeof(struct phys_region *));
+               USE(r, r->length -= len;);
        } else if(offset + len == r->length) {
                assert(len <= r->length);
                r->length -= len;
index 8ccdaaaa04e3f17048ee95c4a874e609127fdd27..7c7f248110e178638d9fc606858e95b32b6bb305 100644 (file)
@@ -75,6 +75,21 @@ readblock(int b, int blocksize, u32_t seed, char *data)
 
 void testend(void) { }
 
+void basic_regression(void)
+{
+       void *block;
+#define BLOCKSIZE (PAGE_SIZE*10)
+       block = minix_mmap(0, BLOCKSIZE, PROT_READ | PROT_WRITE,
+               MAP_PRIVATE | MAP_ANON, -1, 0);
+
+       if(block == MAP_FAILED) { e(1); exit(1); }
+
+       memset(block, 0, BLOCKSIZE);
+
+       /* shrink from bottom */
+       minix_munmap(block, PAGE_SIZE);
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -82,6 +97,8 @@ main(int argc, char *argv[])
 
        start(74);
 
+       basic_regression();
+
        makefiles(MAXFILES);
 
        cachequiet(!bigflag);