aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2023-07-28 12:02:38 -0600
committerTom Tromey <tromey@adacore.com>2023-07-31 06:35:32 -0600
commit30c01bb104e4dfc50e8cf3d0312bbf7d22f73d10 (patch)
treef906d765c5224c1d8a24bccd2649a99ced0bde2f
parent55b1edf5994a09be98d45a598d9bb721222b88d0 (diff)
downloadgdb-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__.py4
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):