summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2013-08-18 01:16:16 (GMT)
committerChristian Heimes <christian@cheimes.de>2013-08-18 01:16:16 (GMT)
commit17dd53b4645c4684e8b662e937fe0f7cd3b45088 (patch)
tree313ccf43fed6fc3cbfe3813cd9a4ec65a0033a14 /Lib
parent5bb2c8668d7dce169cc0f22ede964cb226bb3d5f (diff)
parent8f0bddad308f8c52bf16e3f90a864b2a168e3291 (diff)
downloadcpython-17dd53b4645c4684e8b662e937fe0f7cd3b45088.zip
cpython-17dd53b4645c4684e8b662e937fe0f7cd3b45088.tar.gz
cpython-17dd53b4645c4684e8b662e937fe0f7cd3b45088.tar.bz2
merge
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_signal.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 1efb5f7..3530d8a 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -275,6 +275,57 @@ class WakeupSignalTests(unittest.TestCase):
assert_python_ok('-c', code)
+ def test_wakeup_write_error(self):
+ # Issue #16105: write() errors in the C signal handler should not
+ # pass silently.
+ # Use a subprocess to have only one thread.
+ code = """if 1:
+ import errno
+ import fcntl
+ import os
+ import signal
+ import sys
+ import time
+ from test.support import captured_stderr
+
+ def handler(signum, frame):
+ 1/0
+
+ signal.signal(signal.SIGALRM, handler)
+ r, w = os.pipe()
+ flags = fcntl.fcntl(r, fcntl.F_GETFL, 0)
+ fcntl.fcntl(r, fcntl.F_SETFL, flags | os.O_NONBLOCK)
+
+ # Set wakeup_fd a read-only file descriptor to trigger the error
+ signal.set_wakeup_fd(r)
+ try:
+ with captured_stderr() as err:
+ signal.alarm(1)
+ time.sleep(5.0)
+ except ZeroDivisionError:
+ # An ignored exception should have been printed out on stderr
+ err = err.getvalue()
+ if ('Exception ignored when trying to write to the signal wakeup fd'
+ not in err):
+ raise AssertionError(err)
+ if ('OSError: [Errno %d]' % errno.EBADF) not in err:
+ raise AssertionError(err)
+ else:
+ raise AssertionError("ZeroDivisionError not raised")
+ """
+ r, w = os.pipe()
+ try:
+ os.write(r, b'x')
+ except OSError:
+ pass
+ else:
+ self.skipTest("OS doesn't report write() error on the read end of a pipe")
+ finally:
+ os.close(r)
+ os.close(w)
+
+ assert_python_ok('-c', code)
+
def test_wakeup_fd_early(self):
self.check_wakeup("""def test():
import select