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