ntdll: Don't use a real guard page at the bottom of the stack.
A no-access page is enough, we can't properly raise an overflow exception anyway.
This commit is contained in:
parent
f0c55e7d52
commit
efffa66330
|
@ -994,7 +994,7 @@ static void *init_stack(void)
|
||||||
NtCurrentTeb()->Tib.StackLimit = (char *)base + page_size;
|
NtCurrentTeb()->Tib.StackLimit = (char *)base + page_size;
|
||||||
|
|
||||||
/* setup guard page */
|
/* setup guard page */
|
||||||
VirtualProtect( base, 1, PAGE_READWRITE | PAGE_GUARD, NULL );
|
VirtualProtect( base, page_size, PAGE_NOACCESS, NULL );
|
||||||
return NtCurrentTeb()->Tib.StackBase;
|
return NtCurrentTeb()->Tib.StackBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -223,8 +223,7 @@ static void start_thread( struct wine_pthread_thread_info *info )
|
||||||
|
|
||||||
/* setup the guard page */
|
/* setup the guard page */
|
||||||
size = page_size;
|
size = page_size;
|
||||||
NtProtectVirtualMemory( NtCurrentProcess(), &teb->DeallocationStack, &size,
|
NtProtectVirtualMemory( NtCurrentProcess(), &teb->DeallocationStack, &size, PAGE_NOACCESS, NULL );
|
||||||
PAGE_READWRITE | PAGE_GUARD, NULL );
|
|
||||||
RtlFreeHeap( GetProcessHeap(), 0, info );
|
RtlFreeHeap( GetProcessHeap(), 0, info );
|
||||||
|
|
||||||
RtlAcquirePebLock();
|
RtlAcquirePebLock();
|
||||||
|
|
|
@ -1178,17 +1178,13 @@ NTSTATUS VIRTUAL_HandleFault( LPCVOID addr )
|
||||||
RtlEnterCriticalSection( &csVirtual );
|
RtlEnterCriticalSection( &csVirtual );
|
||||||
if ((view = VIRTUAL_FindView( addr )))
|
if ((view = VIRTUAL_FindView( addr )))
|
||||||
{
|
{
|
||||||
BYTE vprot = view->prot[((const char *)addr - (const char *)view->base) >> page_shift];
|
void *page = ROUND_ADDR( addr, page_mask );
|
||||||
void *page = (void *)((UINT_PTR)addr & ~page_mask);
|
BYTE vprot = view->prot[((const char *)page - (const char *)view->base) >> page_shift];
|
||||||
char *stack = NtCurrentTeb()->Tib.StackLimit;
|
|
||||||
if (vprot & VPROT_GUARD)
|
if (vprot & VPROT_GUARD)
|
||||||
{
|
{
|
||||||
VIRTUAL_SetProt( view, page, page_mask + 1, vprot & ~VPROT_GUARD );
|
VIRTUAL_SetProt( view, page, page_mask + 1, vprot & ~VPROT_GUARD );
|
||||||
ret = STATUS_GUARD_PAGE_VIOLATION;
|
ret = STATUS_GUARD_PAGE_VIOLATION;
|
||||||
}
|
}
|
||||||
/* is it inside the stack guard page? */
|
|
||||||
if (((const char *)addr >= stack - (page_mask + 1)) && ((const char *)addr < stack))
|
|
||||||
ret = STATUS_STACK_OVERFLOW;
|
|
||||||
}
|
}
|
||||||
RtlLeaveCriticalSection( &csVirtual );
|
RtlLeaveCriticalSection( &csVirtual );
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue