diff options
author | Christopher Faylor <me@cgf.cx> | 2003-08-29 02:05:00 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2003-08-29 02:05:00 +0000 |
commit | 5e8355c765038b2ce608fa00eeebc900de12ddb1 (patch) | |
tree | 0e886f40ea6b98f573e414d56180fa8d9817eed7 /winsup/cygwin/exceptions.cc | |
parent | 723b87cd5cad158a20c39349720e405635d2fd41 (diff) | |
download | cygnal-5e8355c765038b2ce608fa00eeebc900de12ddb1.tar.gz cygnal-5e8355c765038b2ce608fa00eeebc900de12ddb1.tar.bz2 cygnal-5e8355c765038b2ce608fa00eeebc900de12ddb1.zip |
* exceptions.cc (sigreturn): Fix problem where old return address was not
properly restored for a nested signal.
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r-- | winsup/cygwin/exceptions.cc | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index ae2c400a6..075b3cc92 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -1219,7 +1219,9 @@ _sigreturn: \n\ cmpl $0,%4 # Did a signal come in? \n\ jz 1f # No, if zero \n\ movl %2,%%eax \n\ - movl %%eax,36(%%esp) # Restore return address \n\ + movl %8,%%ebx # Where return address lives \n\ + movl %%eax,(%%ebx) # Restore return address of \n\ + # most recent caller \n\ jmp 3f \n\ \n\ 1: popl %%eax # saved errno \n\ @@ -1266,10 +1268,10 @@ _sigdelayed0: \n\ popl %%eax \n\ jmp *%%eax \n\ __no_sig_end: \n\ -" : "=m" (sigsave.sig): "X" ((char *) &_impure_ptr->_errno), - "g" (sigsave.retaddr), "g" (sigsave.oldmask), "g" (sigsave.sig), - "g" (sigsave.func), "g" (sigsave.saved_errno), "g" (sigsave.newmask), - "g" (sigsave.retaddr_on_stack) +" : "=m" (sigsave.sig)/*0*/: "X" ((char *) &_impure_ptr->_errno)/*1*/, + "g" (sigsave.retaddr)/*2*/, "g" (sigsave.oldmask)/*3*/, "g" (sigsave.sig)/*4*/, + "g" (sigsave.func)/*5*/, "g" (sigsave.saved_errno)/*6*/, "g" (sigsave.newmask)/*7*/, + "g" (sigsave.retaddr_on_stack)/*8*/ ); } } |