Commit f21096ad authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Don't force anonymous file mappings to always be fully committed.

parent cdce50f5
......@@ -531,9 +531,7 @@ static void test_MapViewOfFile(void)
ok(info.AllocationBase == ptr, "AllocationBase should have been %p but was %p instead\n", ptr, info.AllocationBase);
ok(info.AllocationProtect == PAGE_READWRITE, "AllocationProtect should have been PAGE_READWRITE but was 0x%x\n", info.AllocationProtect);
ok(info.RegionSize == MAPPING_SIZE, "RegionSize should have been 0x%x but was 0x%x\n", MAPPING_SIZE, (unsigned int)info.RegionSize);
todo_wine
ok(info.State == MEM_RESERVE, "State should have been MEM_RESERVE instead of 0x%x\n", info.State);
todo_wine
ok(info.Protect == 0, "Protect should have been 0 instead of 0x%x\n", info.Protect);
ok(info.Type == MEM_MAPPED, "Type should have been MEM_MAPPED instead of 0x%x\n", info.Type);
......@@ -543,9 +541,7 @@ todo_wine
ok(info.AllocationBase == ptr2, "AllocationBase should have been %p but was %p instead\n", ptr2, info.AllocationBase);
ok(info.AllocationProtect == PAGE_READWRITE, "AllocationProtect should have been PAGE_READWRITE but was 0x%x\n", info.AllocationProtect);
ok(info.RegionSize == MAPPING_SIZE, "RegionSize should have been 0x%x but was 0x%x\n", MAPPING_SIZE, (unsigned int)info.RegionSize);
todo_wine
ok(info.State == MEM_RESERVE, "State should have been MEM_RESERVE instead of 0x%x\n", info.State);
todo_wine
ok(info.Protect == 0, "Protect should have been 0 instead of 0x%x\n", info.Protect);
ok(info.Type == MEM_MAPPED, "Type should have been MEM_MAPPED instead of 0x%x\n", info.Type);
......@@ -570,7 +566,6 @@ todo_wine
ok(info.BaseAddress == ptr2, "BaseAddress should have been %p but was %p instead\n", ptr2, info.BaseAddress);
ok(info.AllocationBase == ptr2, "AllocationBase should have been %p but was %p instead\n", ptr2, info.AllocationBase);
ok(info.AllocationProtect == PAGE_READWRITE, "AllocationProtect should have been PAGE_READWRITE but was 0x%x\n", info.AllocationProtect);
todo_wine
ok(info.RegionSize == 0x10000, "RegionSize should have been 0x10000 but was 0x%x\n", (unsigned int)info.RegionSize);
ok(info.State == MEM_COMMIT, "State should have been MEM_RESERVE instead of 0x%x\n", info.State);
ok(info.Protect == PAGE_READWRITE, "Protect should have been 0 instead of 0x%x\n", info.Protect);
......
......@@ -824,7 +824,7 @@ static NTSTATUS map_file_into_view( struct file_view *view, int fd, size_t start
off_t offset, unsigned int vprot, BOOL removable )
{
void *ptr;
int prot = VIRTUAL_GetUnixProt( vprot );
int prot = VIRTUAL_GetUnixProt( vprot | VPROT_COMMITTED /* make sure it is accessible */ );
BOOL shared_write = (vprot & VPROT_WRITE) != 0;
assert( start < view->size );
......@@ -1422,15 +1422,15 @@ void VIRTUAL_SetForceExec( BOOL enable )
LIST_FOR_EACH_ENTRY( view, &views_list, struct file_view, entry )
{
UINT i, count;
int unix_prot;
char *addr = view->base;
BYTE prot = view->prot[0];
BYTE commit = view->mapping ? VPROT_COMMITTED : 0; /* file mappings are always accessible */
int unix_prot = VIRTUAL_GetUnixProt( view->prot[0] | commit );
if (view->protect & VPROT_NOEXEC) continue;
for (count = i = 1; i < view->size >> page_shift; i++, count++)
{
if (view->prot[i] == prot) continue;
unix_prot = VIRTUAL_GetUnixProt( prot );
int prot = VIRTUAL_GetUnixProt( view->prot[i] | commit );
if (prot == unix_prot) continue;
if ((unix_prot & PROT_READ) && !(unix_prot & PROT_EXEC))
{
TRACE( "%s exec prot for %p-%p\n",
......@@ -1440,12 +1440,11 @@ void VIRTUAL_SetForceExec( BOOL enable )
unix_prot | (force_exec_prot ? PROT_EXEC : 0) );
}
addr += (count << page_shift);
prot = view->prot[i];
unix_prot = prot;
count = 0;
}
if (count)
{
unix_prot = VIRTUAL_GetUnixProt( prot );
if ((unix_prot & PROT_READ) && !(unix_prot & PROT_EXEC))
{
TRACE( "%s exec prot for %p-%p\n",
......@@ -2012,11 +2011,7 @@ NTSTATUS WINAPI NtCreateSection( HANDLE *handle, ACCESS_MASK access, const OBJEC
}
vprot = VIRTUAL_GetProt( protect );
if (sec_flags & SEC_RESERVE)
{
if (file) return STATUS_INVALID_PARAMETER;
}
else vprot |= VPROT_COMMITTED;
if (!(sec_flags & SEC_RESERVE)) vprot |= VPROT_COMMITTED;
if (sec_flags & SEC_NOCACHE) vprot |= VPROT_NOCACHE;
if (sec_flags & SEC_IMAGE) vprot |= VPROT_IMAGE;
......@@ -2200,14 +2195,6 @@ NTSTATUS WINAPI NtMapViewOfSection( HANDLE handle, HANDLE process, PVOID *addr_p
goto done;
}
/* FIXME: If a mapping is created with SEC_RESERVE and a process,
* which has a view of this mapping commits some pages, they will
* appear committed in all other processes, which have the same
* view created. Since we don't support this yet, we create the
* whole mapping committed.
*/
prot |= VPROT_COMMITTED;
/* Reserve a properly aligned area */
server_enter_uninterrupted_section( &csVirtual, &sigset );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment