diff options
author | Tom Tromey <tromey@adacore.com> | 2023-07-28 12:02:38 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-07-31 06:35:32 -0600 |
commit | 30c01bb104e4dfc50e8cf3d0312bbf7d22f73d10 (patch) | |
tree | f906d765c5224c1d8a24bccd2649a99ced0bde2f | |
parent | 55b1edf5994a09be98d45a598d9bb721222b88d0 (diff) | |
download | gdb-30c01bb104e4dfc50e8cf3d0312bbf7d22f73d10.zip gdb-30c01bb104e4dfc50e8cf3d0312bbf7d22f73d10.tar.gz gdb-30c01bb104e4dfc50e8cf3d0312bbf7d22f73d10.tar.bz2 |
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
-rw-r--r-- | gdb/python/lib/gdb/__init__.py | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/gdb/python/lib/gdb/__init__.py b/gdb/python/lib/gdb/__init__.py index 98aadb1..b312436 100644 --- a/gdb/python/lib/gdb/__init__.py +++ b/gdb/python/lib/gdb/__init__.py @@ -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): |