* mmap.cc (mprotect): When MAP_WRITE protection is requested, use
READWRITE or WRITECOPY protection, whatever has been used when the page has been allocated initially.
This commit is contained in:
parent
4243412aa5
commit
0c0ad23a2c
|
@ -1,3 +1,9 @@
|
||||||
|
2004-07-15 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* mmap.cc (mprotect): When MAP_WRITE protection is requested, use
|
||||||
|
READWRITE or WRITECOPY protection, whatever has been used when the
|
||||||
|
page has been allocated initially.
|
||||||
|
|
||||||
2004-07-15 Corinna Vinschen <corinna@vinschen.de>
|
2004-07-15 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler.h (class fhandler_dev_raw): Remove is_writing flag.
|
* fhandler.h (class fhandler_dev_raw): Remove is_writing flag.
|
||||||
|
|
|
@ -786,15 +786,31 @@ mprotect (void *addr, size_t len, int prot)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If write protection is requested, check if the page was
|
||||||
|
originally protected writecopy. In this case call VirtualProtect
|
||||||
|
requesting PAGE_WRITECOPY, otherwise the VirtualProtect will fail
|
||||||
|
on NT version >= 5.0 */
|
||||||
|
bool writecopy = false;
|
||||||
|
if (prot & PROT_WRITE)
|
||||||
|
{
|
||||||
|
MEMORY_BASIC_INFORMATION mbi;
|
||||||
|
if (VirtualQuery (addr, &mbi, sizeof mbi))
|
||||||
|
{
|
||||||
|
if (mbi.AllocationProtect == PAGE_WRITECOPY
|
||||||
|
|| mbi.AllocationProtect == PAGE_EXECUTE_WRITECOPY)
|
||||||
|
writecopy = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (prot)
|
switch (prot)
|
||||||
{
|
{
|
||||||
case PROT_READ | PROT_WRITE | PROT_EXEC:
|
case PROT_READ | PROT_WRITE | PROT_EXEC:
|
||||||
case PROT_WRITE | PROT_EXEC:
|
case PROT_WRITE | PROT_EXEC:
|
||||||
new_prot = PAGE_EXECUTE_READWRITE;
|
new_prot = writecopy ? PAGE_EXECUTE_WRITECOPY : PAGE_EXECUTE_READWRITE;
|
||||||
break;
|
break;
|
||||||
case PROT_READ | PROT_WRITE:
|
case PROT_READ | PROT_WRITE:
|
||||||
case PROT_WRITE:
|
case PROT_WRITE:
|
||||||
new_prot = PAGE_READWRITE;
|
new_prot = writecopy ? PAGE_WRITECOPY : PAGE_READWRITE;
|
||||||
break;
|
break;
|
||||||
case PROT_READ | PROT_EXEC:
|
case PROT_READ | PROT_EXEC:
|
||||||
new_prot = PAGE_EXECUTE_READ;
|
new_prot = PAGE_EXECUTE_READ;
|
||||||
|
|
Loading…
Reference in New Issue