summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-02-25 11:47:17 +0000
committerCorinna Vinschen <corinna@vinschen.de>2005-02-25 11:47:17 +0000
commita3079b47feb519503adafcddf107d6f1fd5ad3d5 (patch)
treeb07c623b360cf00287b6ca42d5856a768828c4f1
parentc68de3a262fe58127c2dff6f046cc825509887d2 (diff)
downloadcygnal-a3079b47feb519503adafcddf107d6f1fd5ad3d5.tar.gz
cygnal-a3079b47feb519503adafcddf107d6f1fd5ad3d5.tar.bz2
cygnal-a3079b47feb519503adafcddf107d6f1fd5ad3d5.zip
* mmap.cc (mmap64): Handle MAP_FIXED request on non-granulation
boundary.
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/mmap.cc6
2 files changed, 10 insertions, 1 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 5079dac1a..dc49a999e 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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.
diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc
index 068413bb3..1a8f15338 100644
--- a/winsup/cygwin/mmap.cc
+++ b/winsup/cygwin/mmap.cc
@@ -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;