aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2006-07-13 10:29:26 +0000
committerCorinna Vinschen <corinna@vinschen.de>2006-07-13 10:29:26 +0000
commit047db19bc2428114206a2c15aa6eee776b41ae30 (patch)
treeaffae5efdeb6598c091da013e9aed1d129aabfcf
parentc7963ce29bf5a4c35c75ead5fef44c0c01d3fbfd (diff)
downloadnewlib-047db19bc2428114206a2c15aa6eee776b41ae30.zip
newlib-047db19bc2428114206a2c15aa6eee776b41ae30.tar.gz
newlib-047db19bc2428114206a2c15aa6eee776b41ae30.tar.bz2
* 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.
-rw-r--r--winsup/cygwin/ChangeLog14
-rw-r--r--winsup/cygwin/mmap.cc13
2 files changed, 24 insertions, 3 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index f63f111..d30412c 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,19 @@
2006-07-13 Corinna Vinschen <corinna@vinschen.de>
+ * 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 <corinna@vinschen.de>
+
+ * mmap.cc (mmap64): Drop MAP_RESERVED flag for all non-anonymous,
+ non-private mappings.
+
+2006-07-13 Corinna Vinschen <corinna@vinschen.de>
+
* exceptions.cc (_cygtls::handle_exceptions): Call new
mmap_is_attached_or_noreserve_page function in case of access violation
and allow application to retry access on noreserve pages.
diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc
index 193ed7c..85718ee 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))
{