@@ -1070,6 +1070,49 @@ def test_urandom_failure(self):
10701070 """
10711071 assert_python_ok ('-c' , code )
10721072
1073+ def test_urandom_fd_closed (self ):
1074+ # Issue #21207: urandom() should reopen its fd to /dev/urandom if
1075+ # closed.
1076+ code = """if 1:
1077+ import os
1078+ import sys
1079+ os.urandom(4)
1080+ os.closerange(3, 256)
1081+ sys.stdout.buffer.write(os.urandom(4))
1082+ """
1083+ rc , out , err = assert_python_ok ('-Sc' , code )
1084+
1085+ def test_urandom_fd_reopened (self ):
1086+ # Issue #21207: urandom() should detect its fd to /dev/urandom
1087+ # changed to something else, and reopen it.
1088+ with open (support .TESTFN , 'wb' ) as f :
1089+ f .write (b"x" * 256 )
1090+ self .addCleanup (os .unlink , support .TESTFN )
1091+ code = """if 1:
1092+ import os
1093+ import sys
1094+ os.urandom(4)
1095+ for fd in range(3, 256):
1096+ try:
1097+ os.close(fd)
1098+ except OSError:
1099+ pass
1100+ else:
1101+ # Found the urandom fd (XXX hopefully)
1102+ break
1103+ os.closerange(3, 256)
1104+ with open({TESTFN!r}, 'rb') as f:
1105+ os.dup2(f.fileno(), fd)
1106+ sys.stdout.buffer.write(os.urandom(4))
1107+ sys.stdout.buffer.write(os.urandom(4))
1108+ """ .format (TESTFN = support .TESTFN )
1109+ rc , out , err = assert_python_ok ('-Sc' , code )
1110+ self .assertEqual (len (out ), 8 )
1111+ self .assertNotEqual (out [0 :4 ], out [4 :8 ])
1112+ rc , out2 , err2 = assert_python_ok ('-Sc' , code )
1113+ self .assertEqual (len (out2 ), 8 )
1114+ self .assertNotEqual (out2 , out )
1115+
10731116
10741117@contextlib .contextmanager
10751118def _execvpe_mockup (defpath = None ):
0 commit comments