From d26f74296b004325bc8173046425c5c8d72e605f Mon Sep 17 00:00:00 2001 From: cgf Date: Thu, 23 Feb 2006 19:21:21 +0000 Subject: [PATCH] * winsup.h (cygwin_hmodule): Declare. * exceptions.cc (inside_kernel): Reverse return values to reflect function name. Return true if we're in cygwin1.dll or if we're executing in dll_entry. (_cygtls::interrupt_now): Reflect reversal of inside_kernel return value. * hookapi.cc (cygwin_hmodule): Remove declaration. * init.cc (dll_entry): Use in_dllentry global to record that we are executing in dllentry. --- winsup/cygwin/ChangeLog | 12 ++++++++++++ winsup/cygwin/exceptions.cc | 20 ++++++++++++-------- winsup/cygwin/hookapi.cc | 1 - winsup/cygwin/init.cc | 5 ++++- winsup/cygwin/winsup.h | 1 + 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index fac9a795e8..ccb3686eed 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2006-02-23 Christopher Faylor + + * winsup.h (cygwin_hmodule): Declare. + * exceptions.cc (inside_kernel): Reverse return values to reflect + function name. Return true if we're in cygwin1.dll or if we're + executing in dll_entry. + (_cygtls::interrupt_now): Reflect reversal of inside_kernel return + value. + * hookapi.cc (cygwin_hmodule): Remove declaration. + * init.cc (dll_entry): Use in_dllentry global to record that we are + executing in dllentry. + 2006-02-22 Corinna Vinschen * exceptions.cc (_cygtls::interrupt_now): Reorder conditional diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 33ba9f02d1..5e6a217a02 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -293,6 +293,10 @@ inside_kernel (CONTEXT *cx) { int res; MEMORY_BASIC_INFORMATION m; + extern bool in_dllentry; + + if (in_dllentry) + return true; memset (&m, 0, sizeof m); if (!VirtualQuery ((LPCVOID) cx->Eip, &m, sizeof m)) @@ -305,16 +309,16 @@ inside_kernel (CONTEXT *cx) /* Apparently Windows 95 can sometimes return bogus addresses from GetThreadContext. These resolve to a strange allocation base. These should *never* be treated as interruptible. */ - if (!h || m.State != MEM_COMMIT) - res = false; - else if (h == user_data->hmodule) + if (!h || m.State != MEM_COMMIT || h == cygwin_hmodule) res = true; + else if (h == user_data->hmodule) + res = false; else if (!GetModuleFileName (h, checkdir, windows_system_directory_length + 2)) - res = true; + res = false; else - res = !strncasematch (windows_system_directory, checkdir, - windows_system_directory_length); - sigproc_printf ("pc %p, h %p, interruptible %d", cx->Eip, h, res); + res = strncasematch (windows_system_directory, checkdir, + windows_system_directory_length); + sigproc_printf ("pc %p, h %p, inside_kernel %d", cx->Eip, h, res); # undef h return res; } @@ -726,7 +730,7 @@ _cygtls::interrupt_now (CONTEXT *cx, int sig, void *handler, { bool interrupted; - if (incyg || spinning || locked () || !inside_kernel (cx)) + if (incyg || spinning || locked () || inside_kernel (cx)) interrupted = false; else { diff --git a/winsup/cygwin/hookapi.cc b/winsup/cygwin/hookapi.cc index 2ef1eea47f..a58814e6bb 100644 --- a/winsup/cygwin/hookapi.cc +++ b/winsup/cygwin/hookapi.cc @@ -111,7 +111,6 @@ RedirectIAT (function_hook& fh, PIMAGE_IMPORT_DESCRIPTOR pImportDesc, void get_export (function_hook& fh) { - extern HMODULE cygwin_hmodule; PIMAGE_DOS_HEADER pdh = (PIMAGE_DOS_HEADER) cygwin_hmodule; if (pdh->e_magic != IMAGE_DOS_SIGNATURE) return; diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc index 5a4d5690b0..3fd91c1d63 100644 --- a/winsup/cygwin/init.cc +++ b/winsup/cygwin/init.cc @@ -142,12 +142,14 @@ respawn_wow64_process () extern void __stdcall dll_crt0_0 (); HMODULE NO_COPY cygwin_hmodule; +bool in_dllentry; extern "C" BOOL WINAPI dll_entry (HANDLE h, DWORD reason, void *static_load) { BOOL wow64_test_stack_marker; - // _STRACE_ON; + + in_dllentry = true; switch (reason) { @@ -182,5 +184,6 @@ dll_entry (HANDLE h, DWORD reason, void *static_load) break; } + in_dllentry = false; return TRUE; } diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index f2eab08bcb..eaae8e0ab1 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -354,6 +354,7 @@ extern HANDLE hMainProc; extern HANDLE hProcToken; extern HANDLE hProcImpToken; extern HANDLE hExeced; +extern HMODULE cygwin_hmodule; extern bool cygwin_testing; -- 2.11.0