diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-12-12 10:00:32 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-12-12 10:00:32 +0000 |
commit | 2193d02b4ddfc329e0817258093a40050b2d582a (patch) | |
tree | 111e7e864b2cf654df2c5ec1de6758dc23bf1136 /winsup/cygwin/mmap.cc | |
parent | 4e8e54543e9e9dc20786e1f554d92186f812517e (diff) | |
download | cygnal-2193d02b4ddfc329e0817258093a40050b2d582a.tar.gz cygnal-2193d02b4ddfc329e0817258093a40050b2d582a.tar.bz2 cygnal-2193d02b4ddfc329e0817258093a40050b2d582a.zip |
* mmap.cc (gen_create_protect): Always generate WRITECOPY protection
for private maps.
(fixup_mmaps_after_fork): Fix calculation of WRITECOPY protection for
VirtualProtect. Add some words to the comment.
Diffstat (limited to 'winsup/cygwin/mmap.cc')
-rw-r--r-- | winsup/cygwin/mmap.cc | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc index 2414668b5..ee6382c44 100644 --- a/winsup/cygwin/mmap.cc +++ b/winsup/cygwin/mmap.cc @@ -98,8 +98,10 @@ gen_create_protect (DWORD openflags, int flags) { DWORD ret = PAGE_READONLY; - if (openflags & GENERIC_WRITE) - ret = priv (flags) ? PAGE_WRITECOPY : PAGE_READWRITE; + if (priv (flags)) + ret = PAGE_WRITECOPY; + else if (openflags & GENERIC_WRITE) + ret = PAGE_READWRITE; /* Ignore EXECUTE permission on 9x. */ if ((openflags & GENERIC_EXECUTE) @@ -1963,16 +1965,16 @@ fixup_mmaps_after_fork (HANDLE parent) "address %p, %E", address); return -1; } - else if ((mbi.AllocationProtect & PAGE_WRITECOPY) + else if ((mbi.AllocationProtect == PAGE_WRITECOPY + || mbi.AllocationProtect == PAGE_EXECUTE_WRITECOPY) && (mbi.Protect == PAGE_READWRITE || mbi.Protect == PAGE_EXECUTE_READWRITE)) - { - /* A PAGE_WRITECOPY page which has been written to is - set to PAGE_READWRITE, but that's an incompatible - protection to set the page to. */ - mbi.Protect &= ~PAGE_READWRITE; - mbi.Protect |= PAGE_WRITECOPY; - } + /* A WRITECOPY page which has been written to is set to + READWRITE, but that's an incompatible protection to + set the page to. Convert the protection to WRITECOPY + so that the below VirtualProtect doesn't fail. */ + mbi.Protect <<= 1; + if (!ReadProcessMemory (parent, address, address, mbi.RegionSize, NULL)) { |