__do_mmap() also adjusts anonymous addresses
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 19 Jul 2011 18:19:33 +0000 (11:19 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:05 +0000 (17:36 -0700)
Necessary for kernel do_mmap() calls that avoid mmap().

kern/src/mm.c

index 0052db5..f894dfc 100644 (file)
@@ -321,7 +321,8 @@ void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
        /* If they don't care where to put it, we'll start looking after the break.
         * We could just have userspace handle this (in glibc's mmap), so we don't
         * need to know about BRK_END, but this will work for now (and may avoid
-        * bugs).  Note that this limits mmap(0) a bit. */
+        * bugs).  Note that this limits mmap(0) a bit.  Keep this in sync with
+        * __do_mmap()'s check.  (Both are necessary).  */
        if (addr == 0)
                addr = BRK_END;
        /* Still need to enforce this: */
@@ -351,6 +352,12 @@ void *__do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
 
        struct vm_region *vmr, *vmr_temp;
 
+       /* Sanity check, for callers that bypass mmap().  We want addr for anon
+        * memory to start above the break limit (BRK_END), but not 0.  Keep this in
+        * sync with BRK_END in mmap(). */
+       if (addr == 0)
+               addr = BRK_END;
+
 #ifndef __CONFIG_DEMAND_PAGING__
        flags |= MAP_POPULATE;
 #endif