]> Zhao Yanbai Git Server - minix.git/commitdiff
VM: shared memory pagefault fix 86/386/2
authorBen Gras <ben@minix3.org>
Tue, 5 Mar 2013 16:17:21 +0000 (17:17 +0100)
committerBen Gras <ben@minix3.org>
Thu, 7 Mar 2013 09:40:22 +0000 (10:40 +0100)
. if there is no memory there, it's not writable; this
  check bug by the shared memory's writable() method causes
  pagefaults not to be handled  at all in certain situations,
  triggering an assert() in pt_writemap()
. added some assert()s to catch this and similar situations
  in the future

Change-Id: Ife89bfab4f9a3aa7bf4e33dfb0b13b89dcd5bb94

servers/vm/mem_anon.c
servers/vm/region.c

index 0971708fd7f304732bbab91de5ea9f0fbbc779ca..55d30bc237a8a8827c13f430ea413f37fee9432f 100644 (file)
@@ -108,9 +108,11 @@ static int anon_sanitycheck(struct phys_region *pr, char *file, int line)
 static int anon_writable(struct phys_region *pr)
 {
        assert(pr->ph->refcount > 0);
+       if(pr->ph->phys == MAP_NONE)
+               return 0;
        if(pr->parent->remaps > 0)
                return 1;
-       return pr->ph->phys != MAP_NONE && pr->ph->refcount == 1;
+       return pr->ph->refcount == 1;
 }
 
 static int anon_resize(struct vmproc *vmp, struct vir_region *vr, vir_bytes l)
index 8d55fe3aefa9ebfcfb06ff8709f8e78580b30385..78ad03f31ef363152f2e04999407f93af1470713 100644 (file)
@@ -1032,9 +1032,11 @@ int write;
 
                assert(ph);
                assert(ph->ph);
+               assert(ph->ph->phys != MAP_NONE);
        }
 
        assert(ph->ph);
+       assert(ph->ph->phys != MAP_NONE);
 
        if((r = map_ph_writept(vmp, region, ph)) != OK) {
                printf("map_pf: writept failed\n");