Hi Greg, > > Where do you see a problem in this? >
I found that 2 tasks can race calling up_schedule_sigaction to set the sigdeliver in TCB. In up_schedule_sigaction , a critical section should prevent this from happening. However, If the calling task suspends voluntary, e.g. by calling syslog, another task can enter the critical section and race with the other task. The first task moves the RIP in register profile to the TCB and set the RIP in register profile as sigdeliver. The second task moves the RIP in register profile (which is sigdeliver now) to the TCB and set the RIP in register profile as again sigdeliver. The original RIP saved in TCB is overwritten and destroyed. Currently, by removing any possibility voluntary schedule point in the critical section, this problem no longer exists. -- Yang Chung Fan (楊宗凡) (ヤン ゾン ファン) Member of Softlab, Tsukuba University , Japan Email: sonic.tw...@gmail.com