From a3079b47feb519503adafcddf107d6f1fd5ad3d5 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 25 Feb 2005 11:47:17 +0000 Subject: * mmap.cc (mmap64): Handle MAP_FIXED request on non-granulation boundary. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/mmap.cc | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 5079dac1a..dc49a999e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2005-02-25 Corinna Vinschen + + * mmap.cc (mmap64): Handle MAP_FIXED request on non-granulation + boundary. + 2005-02-25 Corinna Vinschen * mmap.cc (class mmap_record): Declare new map_pages method with 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; -- cgit v1.2.3