summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2006-02-23 19:21:21 +0000
committerChristopher Faylor <me@cgf.cx>2006-02-23 19:21:21 +0000
commit7fbfec2b642a0f2560cd4840bab76285b17c3fd0 (patch)
tree16067604f6876513595616ee2e1897e2ed140b64
parent7db9cdd24e884d70f3444fcd3abdf87b0df24479 (diff)
downloadcygnal-7fbfec2b642a0f2560cd4840bab76285b17c3fd0.tar.gz
cygnal-7fbfec2b642a0f2560cd4840bab76285b17c3fd0.tar.bz2
cygnal-7fbfec2b642a0f2560cd4840bab76285b17c3fd0.zip
* 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.
-rw-r--r--winsup/cygwin/ChangeLog12
-rw-r--r--winsup/cygwin/exceptions.cc20
-rw-r--r--winsup/cygwin/hookapi.cc1
-rw-r--r--winsup/cygwin/init.cc5
-rw-r--r--winsup/cygwin/winsup.h1
5 files changed, 29 insertions, 10 deletions
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 <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 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;
- 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 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;