Red Hat Bugzilla – Bug 88093
setcontext() is not signal safe
Last modified: 2007-04-18 12:52:47 EDT
From Bugzilla Helper:
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020529
Description of problem:
setcontext() temporarily stores the new register values on the stack at
addresses less than the stack pointer (before 'popa' to set the new values). If
a signal is delivered between the store and the popa, then the locations that
are read by popa get overwritten, so eventually the wrong values will be set
into the registers.
Version-Release number of selected component (if applicable):
Steps to Reproduce:
1.Run testcase stdlib/tst-setcontext under gdb.
2.Set a breakpoint at setcontext+67: mov %ebx,(%ecx)
3.Print $ecx and $esp at the breakpoint.
$esp = 0xffffcb1c
$ecx = 0xffffcafc # 0x20 less than $esp
$esp = 0xffffcafc
$ecx = 0xffffcafc # == $esp
Fix: move the "movl %ecx, %esp" at line 85 of
sysdeps/unix/sysv/linux/i386/setcontext.S to just after the "subl $36, %ecx" at
A similar problem exists in sysdeps/unix/sysv/linux/i386/swapcontext.S at lines
89 and 114.
An errata has been issued which should help the problem described in this bug report.
This report is therefore being closed with a resolution of ERRATA. For more information
on the solution and/or where to find the updated files, please follow the link below. You may reopen
this bug report if the solution does not work for you.