diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index fac9a795e..ccb3686ee 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 33ba9f02d..5e6a217a0 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; + if (!h || m.State != MEM_COMMIT || h == cygwin_hmodule) + res = true; else if (h == user_data->hmodule) - res = true; + 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 2ef1eea47..a58814e6b 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 5a4d5690b..3fd91c1d6 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 f2eab08bc..eaae8e0ab 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;