mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
Restore previous sigmask in gdb.block_signals
Tom de Vries found a bug where, sometimes, a SIGCHLD would be delivered to a non-main thread, wreaking havoc. The problem is that gdb.block_signals after first blocking a set of signals, then unblocked the same set rather than restoring the initial situation. This function being called from the DAP thread lead to SIGCHLD being unblocked there. This patch fixes the problem by restoring the previous set of signals instead. Tested-by: Tom de Vries <tdevries@suse.de> Reviewed-By: Tom de Vries <tdevries@suse.de> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30680
This commit is contained in:
@ -271,11 +271,11 @@ def blocked_signals():
|
||||
return
|
||||
|
||||
to_block = {signal.SIGCHLD, signal.SIGINT, signal.SIGALRM, signal.SIGWINCH}
|
||||
signal.pthread_sigmask(signal.SIG_BLOCK, to_block)
|
||||
old_mask = signal.pthread_sigmask(signal.SIG_BLOCK, to_block)
|
||||
try:
|
||||
yield None
|
||||
finally:
|
||||
signal.pthread_sigmask(signal.SIG_UNBLOCK, to_block)
|
||||
signal.pthread_sigmask(signal.SIG_SETMASK, old_mask)
|
||||
|
||||
|
||||
class Thread(threading.Thread):
|
||||
|
Reference in New Issue
Block a user