[PATCH 2/2] kernel32: Set up a guard page at the bottom of the fiber stack.

Zebediah Figura zfigura at codeweavers.com
Tue Jun 11 18:09:39 CDT 2019


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/kernel32/fiber.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/dlls/kernel32/fiber.c b/dlls/kernel32/fiber.c
index 526ae57f2f42..8a3de81bb8ea 100644
--- a/dlls/kernel32/fiber.c
+++ b/dlls/kernel32/fiber.c
@@ -89,6 +89,8 @@ LPVOID WINAPI CreateFiberEx( SIZE_T stack_commit, SIZE_T stack_reserve, DWORD fl
                              LPFIBER_START_ROUTINE start, LPVOID param )
 {
     struct fiber_data *fiber;
+    SYSTEM_INFO si;
+    DWORD prev;
 
     if (!(fiber = HeapAlloc( GetProcessHeap(), 0, sizeof(*fiber) )))
     {
@@ -96,16 +98,19 @@ LPVOID WINAPI CreateFiberEx( SIZE_T stack_commit, SIZE_T stack_reserve, DWORD fl
         return NULL;
     }
 
+    GetSystemInfo(&si);
+
     /* FIXME: should use the thread stack allocation routines here */
     /* some applications try to use more stack than they allocate */
-    stack_reserve = max(stack_reserve, 1024 * 1024);
-    if(!(fiber->stack_allocation = VirtualAlloc( 0, stack_reserve, MEM_COMMIT, PAGE_READWRITE )))
+    stack_reserve = max(stack_reserve, 1024 * 1024 - 3 * si.dwPageSize);
+    if(!(fiber->stack_allocation = VirtualAlloc( 0, stack_reserve + 3 * si.dwPageSize, MEM_COMMIT, PAGE_READWRITE )))
     {
         HeapFree( GetProcessHeap(), 0, fiber );
         return NULL;
     }
-    fiber->stack_base  = (char *)fiber->stack_allocation + stack_reserve;
-    fiber->stack_limit = fiber->stack_allocation;
+    VirtualProtect(fiber->stack_allocation, 3 * si.dwPageSize, PAGE_NOACCESS, &prev);
+    fiber->stack_base  = (char *)fiber->stack_allocation + 3 * si.dwPageSize + stack_reserve;
+    fiber->stack_limit = (char *)fiber->stack_allocation + 3 * si.dwPageSize;
     fiber->param       = param;
     fiber->except      = (void *)-1;
     fiber->start       = start;
-- 
2.20.1




More information about the wine-devel mailing list