OSDN Git Service

* mmap.cc (mmap64): Handle MAP_FIXED request on non-granulation
authorcorinna <corinna>
Fri, 25 Feb 2005 11:47:15 +0000 (11:47 +0000)
committercorinna <corinna>
Fri, 25 Feb 2005 11:47:15 +0000 (11:47 +0000)
boundary.

winsup/cygwin/ChangeLog
winsup/cygwin/mmap.cc

index 5079dac..dc49a99 100644 (file)
@@ -1,5 +1,10 @@
 2005-02-25  Corinna Vinschen  <corinna@vinschen.de>
 
+       * mmap.cc (mmap64): Handle MAP_FIXED request on non-granulation
+       boundary.
+
+2005-02-25  Corinna Vinschen  <corinna@vinschen.de>
+
        * mmap.cc (class mmap_record): Declare new map_pages method with
        address parameter.
        (mmap_record::map_pages): New method with address parameter.
index 068413b..1a8f153 100644 (file)
@@ -530,6 +530,10 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off)
   if (flags & MAP_ANONYMOUS)
     fd = -1;
 
+  /* If MAP_FIXED is requested on a non-granularity boundary, change request
+     so that this looks like a request with offset addr % granularity. */
+  if (fd == -1 && (flags & MAP_FIXED) && ((DWORD)addr % granularity) && !off)
+    off = (DWORD)addr % granularity;
   /* Map always in multipliers of `granularity'-sized chunks. */
   _off64_t gran_off = off & ~(granularity - 1);
   DWORD gran_len = howmany (off + len, granularity) * granularity - gran_off;
@@ -615,7 +619,7 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off)
          return ret;
        }
     }
-  if (map_list && fd == -1 && off == 0 && (flags & MAP_FIXED))
+  if (map_list && fd == -1 && (flags & MAP_FIXED))
     {
       caddr_t u_addr;
       DWORD u_len;