Module: wine Branch: master Commit: 8dc8b3e9c06008c646e822d38d3458853254620c URL: http://source.winehq.org/git/wine.git/?a=commit;h=8dc8b3e9c06008c646e822d38d...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Sep 11 19:50:30 2017 +0200
ntdll: Avoid accessing builtin views outside of the critical section.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/virtual.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index 0505617..6065b79 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; + if (!status) + { + TRACE( "created %p-%p\n", base, (char *)base + size );
- /* The PE header is always read-only, no write, no execute. */ - set_page_vprot( view->base, page_size, VPROT_COMMITTED | VPROT_READ ); + /* 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; + 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 *)view->base + sec[i].VirtualAddress, sec[i].Misc.VirtualSize, flags ); + 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; }