diff options
author | Christopher Faylor <me@cgf.cx> | 2006-02-23 19:21:21 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2006-02-23 19:21:21 +0000 |
commit | 7fbfec2b642a0f2560cd4840bab76285b17c3fd0 (patch) | |
tree | 16067604f6876513595616ee2e1897e2ed140b64 /winsup | |
parent | 7db9cdd24e884d70f3444fcd3abdf87b0df24479 (diff) | |
download | newlib-7fbfec2b642a0f2560cd4840bab76285b17c3fd0.zip newlib-7fbfec2b642a0f2560cd4840bab76285b17c3fd0.tar.gz newlib-7fbfec2b642a0f2560cd4840bab76285b17c3fd0.tar.bz2 |
* 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.
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/ChangeLog | 12 | ||||
-rw-r--r-- | winsup/cygwin/exceptions.cc | 20 | ||||
-rw-r--r-- | winsup/cygwin/hookapi.cc | 1 | ||||
-rw-r--r-- | winsup/cygwin/init.cc | 5 | ||||
-rw-r--r-- | winsup/cygwin/winsup.h | 1 |
5 files changed, 29 insertions, 10 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index fac9a79..ccb3686 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2006-02-23 Christopher Faylor <cgf@timesys.com> + + * 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 <corinna@vinschen.de> * exceptions.cc (_cygtls::interrupt_now): Reorder conditional diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 33ba9f0..5e6a217 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 2ef1eea..a58814e 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 5a4d569..3fd91c1 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 f2eab08..eaae8e0 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; |