From cf8b4c4fa67b31560eb076a53b2ede324e23c4cb Mon Sep 17 00:00:00 2001 From: rtoy <rtoy> Date: Sun, 24 Apr 2005 12:41:58 +0000 Subject: [PATCH] Don't use MAP_FIXED so we don't clobber existing mappings. If we can't allocate at the desired address, produce an error message and die gracefully. From James Y Knight, cmucl-imp, 2005/03/11 --- lisp/Linux-os.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/lisp/Linux-os.c b/lisp/Linux-os.c index c582a8cb3..abdc4d81f 100644 --- a/lisp/Linux-os.c +++ b/lisp/Linux-os.c @@ -15,7 +15,7 @@ * GENCGC support by Douglas Crosher, 1996, 1997. * Alpha support by Julian Dolby, 1999. * - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.23 2004/12/24 15:11:10 rtoy Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.24 2005/04/24 12:41:58 rtoy Exp $ * */ @@ -160,25 +160,29 @@ void os_set_context(void) os_vm_address_t os_validate(os_vm_address_t addr, os_vm_size_t len) { int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE; - - if (addr) - flags |= MAP_FIXED; - else - flags |= MAP_VARIABLE; - + os_vm_address_t out_addr; + DPRINTF(0, (stderr, "os_validate %p %d => ", addr, len)); - addr = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0); + out_addr = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0); - if(addr == (os_vm_address_t) -1) + if (out_addr == (os_vm_address_t) -1) { perror("mmap"); return NULL; } - DPRINTF(0, (stderr, "%p\n", addr)); + if (addr && (addr != out_addr)) + { + fprintf(stderr, "Couldn't mmap at %p, len %d; got mapping at %p instead", + addr, len, out_addr); + munmap(addr, len); + return NULL; + } + + DPRINTF(0, (stderr, "%p\n", out_addr)); - return addr; + return out_addr; } void os_invalidate(os_vm_address_t addr, os_vm_size_t len) -- GitLab