diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2011-11-25 20:29:27 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2011-11-25 20:29:27 (GMT) |
commit | c24847658fb1e676391d3db1096219581cd2782c (patch) | |
tree | 0077927f8066b0ed872f5f2c4947e9dd13290b02 /Lib/test/test_tempfile.py | |
parent | cad939bf9d83cd7d9f0b74076e81c3b1de16d88d (diff) | |
parent | 4558bad7d64a7599b46fb56ea2df52319437f3a0 (diff) | |
download | cpython-c24847658fb1e676391d3db1096219581cd2782c.zip cpython-c24847658fb1e676391d3db1096219581cd2782c.tar.gz cpython-c24847658fb1e676391d3db1096219581cd2782c.tar.bz2 |
Issue #12856: Ensure child processes do not inherit the parent's random seed for filename generation in the tempfile module.
Patch by Brian Harring.
Diffstat (limited to 'Lib/test/test_tempfile.py')
-rw-r--r-- | Lib/test/test_tempfile.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 5b0bca7..8fe2986 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1,6 +1,7 @@ # tempfile.py unit tests. import tempfile import os +import signal import sys import re import warnings @@ -135,6 +136,37 @@ class test__RandomNameSequence(TC): except: self.failOnException("iteration") + @unittest.skipUnless(hasattr(os, 'fork'), + "os.fork is required for this test") + def test_process_awareness(self): + # ensure that the random source differs between + # child and parent. + read_fd, write_fd = os.pipe() + pid = None + try: + pid = os.fork() + if not pid: + os.close(read_fd) + os.write(write_fd, next(self.r).encode("ascii")) + os.close(write_fd) + # bypass the normal exit handlers- leave those to + # the parent. + os._exit(0) + parent_value = next(self.r) + child_value = os.read(read_fd, len(parent_value)).decode("ascii") + finally: + if pid: + # best effort to ensure the process can't bleed out + # via any bugs above + try: + os.kill(pid, signal.SIGKILL) + except EnvironmentError: + pass + os.close(read_fd) + os.close(write_fd) + self.assertNotEqual(child_value, parent_value) + + test_classes.append(test__RandomNameSequence) |