From: Corinna Vinschen Date: Wed, 25 May 2011 11:33:29 +0000 (+0000) Subject: * init.cc (dll_entry): Reinstantiate wow64_test_stack_marker and X-Git-Tag: sid-snapshot-20110601~27 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=6215837523703c2c0b58200341ae3861d8b7a28d;p=newlib-cygwin.git * init.cc (dll_entry): Reinstantiate wow64_test_stack_marker and previous stack tests. --- diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ec785dd1b..238d7636b 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2011-05-25 Corinna Vinschen + + * init.cc (dll_entry): Reinstantiate wow64_test_stack_marker and + previous stack tests. + 2011-05-25 Corinna Vinschen * posix.sgml (std-notes): Add missing . diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc index 9f66c3ba2..037990bff 100644 --- a/winsup/cygwin/init.cc +++ b/winsup/cygwin/init.cc @@ -115,7 +115,7 @@ extern void __stdcall dll_crt0_0 (); extern "C" BOOL WINAPI dll_entry (HANDLE h, DWORD reason, void *static_load) { - PTEB teb; + BOOL wow64_test_stack_marker; switch (reason) { @@ -131,10 +131,9 @@ dll_entry (HANDLE h, DWORD reason, void *static_load) the auto load address of DLLs? Check if we're running in WOW64 on a 64 bit machine *and* are spawned by a genuine 64 bit process. If so, respawn. */ - teb = NtCurrentTeb (); if (wincap.is_wow64 () - && teb->Tib.StackLimit >= (PBOOL) 0x400000 - && teb->Tib.StackBase <= (PBOOL) 0x10000000) + && &wow64_test_stack_marker >= (PBOOL) 0x400000 + && &wow64_test_stack_marker <= (PBOOL) 0x10000000) respawn_wow64_process (); dll_crt0_0 (); @@ -150,19 +149,17 @@ dll_entry (HANDLE h, DWORD reason, void *static_load) munge_threadfunc (); break; case DLL_THREAD_DETACH: - teb = NtCurrentTeb (); if (dll_finished_loading - && (PVOID) &teb >= teb->Tib.StackLimit - && (PVOID) &teb < teb->Tib.StackBase + && (PVOID) &_my_tls > (PVOID) &wow64_test_stack_marker && _my_tls.isinitialized ()) _my_tls.remove (0); /* Windows 2000 has a bug in NtTerminateThread. Instead of releasing the stack at teb->DeallocationStack it uses the value of teb->Tib.StackLimit to evaluate the stack address. So we just claim there is no stack. */ - if (teb->DeallocationStack == NULL + if (NtCurrentTeb ()->DeallocationStack == NULL && !wincap.has_stack_size_param_is_a_reservation ()) - teb->Tib.StackLimit = NULL; + NtCurrentTeb ()->Tib.StackLimit = NULL; break; }