From 2e19497afc7b3ba4cf08e36f15ad36bc34f27f13 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 13 Jul 2006 10:29:21 +0000 Subject: [PATCH] * mmap.cc (mmap64): Drop MAP_NORESERVE flag for non-anonymous, non-private mappings. (mmap_record::unmap_pages): Only check noreserve flag which now implies anonymous and private. (mprotect): Ditto. (fixup_mmaps_after_fork): Ditto. --- winsup/cygwin/ChangeLog | 14 ++++++++++++++ winsup/cygwin/mmap.cc | 13 ++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 0a3b7c2d9..b0a43997e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,17 @@ +2006-07-13 Corinna Vinschen + + * mmap.cc (mmap64): Drop MAP_NORESERVE flag for non-anonymous, + non-private mappings. + (mmap_record::unmap_pages): Only check noreserve flag which now implies + anonymous and private. + (mprotect): Ditto. + (fixup_mmaps_after_fork): Ditto. + +2006-07-13 Corinna Vinschen + + * mmap.cc (mmap64): Drop MAP_RESERVED flag for all non-anonymous, + non-private mappings. + 2006-07-13 Corinna Vinschen * exceptions.cc (_cygtls::handle_exceptions): Call new diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc index 193ed7c0f..85718eec7 100644 --- a/winsup/cygwin/mmap.cc +++ b/winsup/cygwin/mmap.cc @@ -647,7 +647,7 @@ mmap_record::unmap_pages (caddr_t addr, DWORD len) DWORD off = addr - get_address (); off /= getpagesize (); len = PAGE_CNT (len); - if (anonymous () && priv () && noreserve () + if (noreserve () && !VirtualFree (get_address () + off * getpagesize (), len * getpagesize (), MEM_DECOMMIT)) debug_printf ("VirtualFree in unmap_pages () failed, %E"); @@ -1027,6 +1027,7 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off) if (fh->get_device () == FH_ZERO) flags |= MAP_ANONYMOUS; } + if (anonymous (flags) || fd == -1) { fh = &fh_anonymous; @@ -1161,6 +1162,12 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off) go_ahead: + /* MAP_NORESERVE is only supported on private anonymous mappings. + Remove that bit from flags so that later code doesn't have to + test all bits. */ + if (noreserve (flags) && (!anonymous (flags) || !priv (flags))) + flags &= ~MAP_NORESERVE; + map_list = mmapped_areas.get_list_by_fd (fd); /* Test if an existing anonymous mapping can be recycled. */ @@ -1427,7 +1434,7 @@ mprotect (void *addr, size_t len, int prot) if (rec->attached ()) continue; new_prot = gen_protect (prot, rec->get_flags ()); - if (rec->anonymous () && rec->priv () && rec->noreserve ()) + if (rec->noreserve ()) { if (new_prot == PAGE_NOACCESS) ret = VirtualFree (u_addr, u_len, MEM_DECOMMIT); @@ -1969,7 +1976,7 @@ fixup_mmaps_after_fork (HANDLE parent) a strange notion how copy-on-write is supposed to work. */ if (rec->priv ()) { - if (rec->anonymous () && rec->noreserve () + if (rec->noreserve () && !VirtualAlloc (address, mbi.RegionSize, MEM_COMMIT, PAGE_READWRITE)) {