From 02b55b32f2cc238677e2035793cba43c21152730 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 18 Dec 2018 23:18:52 +0100 Subject: [PATCH] bpo-31731: Fix test_io.check_interrupted_write() Fix a possible race condition in check_interrupted_write() of test_io: create directly the thread with SIGALRM signal blocked, rather than blocking the signal later from the thread. Previously, it was possible that the thread gets the signal before the signal is blocked. --- Lib/test/test_io.py | 12 +++++++++--- .../Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst | 4 ++++ 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index dc353c159fb028..c3644875103da0 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -4149,10 +4149,9 @@ def check_interrupted_write(self, item, bytes, **fdopen_kwargs): in the latter.""" read_results = [] def _read(): - if hasattr(signal, 'pthread_sigmask'): - signal.pthread_sigmask(signal.SIG_BLOCK, [signal.SIGALRM]) s = os.read(r, 1) read_results.append(s) + t = threading.Thread(target=_read) t.daemon = True r, w = os.pipe() @@ -4160,7 +4159,14 @@ def _read(): large_data = item * (support.PIPE_MAX_SIZE // len(item) + 1) try: wio = self.io.open(w, **fdopen_kwargs) - t.start() + if hasattr(signal, 'pthread_sigmask'): + # create the thread with SIGALRM signal blocked + signal.pthread_sigmask(signal.SIG_BLOCK, [signal.SIGALRM]) + t.start() + signal.pthread_sigmask(signal.SIG_UNBLOCK, [signal.SIGALRM]) + else: + t.start() + # Fill the pipe enough that the write will be blocking. # It will be interrupted by the timer armed above. Since the # other thread has read one byte, the low-level write will diff --git a/Misc/NEWS.d/next/Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst b/Misc/NEWS.d/next/Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst new file mode 100644 index 00000000000000..530977c6e87eb1 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst @@ -0,0 +1,4 @@ +Fix a race condition in ``check_interrupted_write()`` of test_io: create +directly the thread with SIGALRM signal blocked, rather than blocking the +signal later from the thread. Previously, it was possible that the thread gets +the signal before the signal is blocked.