From 8dc8b3e9c06008c646e822d38d3458853254620c Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 11 Sep 2017 19:50:30 +0200 Subject: [PATCH] ntdll: Avoid accessing builtin views outside of the critical section. Signed-off-by: Alexandre Julliard --- dlls/ntdll/virtual.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index 0505617d535..6065b796a51 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c @@ -1634,25 +1634,25 @@ NTSTATUS virtual_create_builtin_view( void *module ) server_enter_uninterrupted_section( &csVirtual, &sigset ); status = create_view( &view, base, size, SEC_IMAGE | SEC_FILE | VPROT_SYSTEM | VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY | VPROT_EXEC ); - if (!status) TRACE( "created %p-%p\n", base, (char *)base + size ); - server_leave_uninterrupted_section( &csVirtual, &sigset ); - - if (status) return status; - - /* The PE header is always read-only, no write, no execute. */ - set_page_vprot( view->base, page_size, VPROT_COMMITTED | VPROT_READ ); - - sec = (IMAGE_SECTION_HEADER *)((char *)&nt->OptionalHeader + nt->FileHeader.SizeOfOptionalHeader); - for (i = 0; i < nt->FileHeader.NumberOfSections; i++) + if (!status) { - BYTE flags = VPROT_COMMITTED; + TRACE( "created %p-%p\n", base, (char *)base + size ); - if (sec[i].Characteristics & IMAGE_SCN_MEM_EXECUTE) flags |= VPROT_EXEC; - if (sec[i].Characteristics & IMAGE_SCN_MEM_READ) flags |= VPROT_READ; - if (sec[i].Characteristics & IMAGE_SCN_MEM_WRITE) flags |= VPROT_WRITE; - set_page_vprot( (char *)view->base + sec[i].VirtualAddress, sec[i].Misc.VirtualSize, flags ); + /* The PE header is always read-only, no write, no execute. */ + set_page_vprot( base, page_size, VPROT_COMMITTED | VPROT_READ ); + + sec = (IMAGE_SECTION_HEADER *)((char *)&nt->OptionalHeader + nt->FileHeader.SizeOfOptionalHeader); + for (i = 0; i < nt->FileHeader.NumberOfSections; i++) + { + BYTE flags = VPROT_COMMITTED; + + if (sec[i].Characteristics & IMAGE_SCN_MEM_EXECUTE) flags |= VPROT_EXEC; + if (sec[i].Characteristics & IMAGE_SCN_MEM_READ) flags |= VPROT_READ; + if (sec[i].Characteristics & IMAGE_SCN_MEM_WRITE) flags |= VPROT_WRITE; + set_page_vprot( (char *)base + sec[i].VirtualAddress, sec[i].Misc.VirtualSize, flags ); + } } - + server_leave_uninterrupted_section( &csVirtual, &sigset ); return status; }