diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a8131c004..397436469 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2011-07-06 Christopher Faylor + + * exceptions.cc (_cygtls::interrupt_now): Back out previous change + since it could theoretically cause a non-CTRL-C-able program if a + program has suffered memory corruption. + (setup_handler): Ditto. + 2011-07-06 Corinna Vinschen * sched.c (sched_yield): Just call SwitchToThread because yield now diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 9db7f4131..638c6e3b8 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -777,8 +777,9 @@ _cygtls::interrupt_now (CONTEXT *cx, int sig, void *handler, /* Delay the interrupt if we are 1) somehow inside the DLL - 2) in a Windows DLL. */ - if (incyg ||inside_kernel (cx)) + 2) in _sigfe (spinning is true) and about to enter cygwin DLL + 3) in a Windows DLL. */ + if (incyg || spinning || inside_kernel (cx)) interrupted = false; else { @@ -882,15 +883,8 @@ setup_handler (int sig, void *handler, struct sigaction& siga, _cygtls *tls) cx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER; if (!GetThreadContext (hth, &cx)) system_printf ("couldn't get context of thread, %E"); - else if (!tls->spinning) - interrupted = tls->interrupt_now (&cx, sig, handler, siga); else - { - /* We should be out of this state very soon so force a retry - without incrementing loop counter. */ - i--; - interrupted = false; - } + interrupted = tls->interrupt_now (&cx, sig, handler, siga); tls->unlock (); res = ResumeThread (hth);