diff options
author | Gregory P. Smith <greg@mad-scientist.com> | 2008-09-02 05:36:11 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@mad-scientist.com> | 2008-09-02 05:36:11 (GMT) |
commit | d712203d17d406b3ebdb1276e5f1694a2a7db120 (patch) | |
tree | a373256f30cd5a98b54a1bc70d57931a47a87d2c /Lib | |
parent | 2bb25cc1e212109dcba04feed4027a2447ec12d1 (diff) | |
download | cpython-d712203d17d406b3ebdb1276e5f1694a2a7db120.zip cpython-d712203d17d406b3ebdb1276e5f1694a2a7db120.tar.gz cpython-d712203d17d406b3ebdb1276e5f1694a2a7db120.tar.bz2 |
Issue #3708: os.urandom no longer goes into an infinite loop when passed a
non-integer floating point number.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/os.py | 12 | ||||
-rw-r--r-- | Lib/test/test_os.py | 4 |
2 files changed, 11 insertions, 5 deletions
@@ -753,8 +753,10 @@ if not _exists("urandom"): _urandomfd = open("/dev/urandom", O_RDONLY) except (OSError, IOError): raise NotImplementedError("/dev/urandom (or equivalent) not found") - bytes = "" - while len(bytes) < n: - bytes += read(_urandomfd, n - len(bytes)) - close(_urandomfd) - return bytes + try: + bs = b"" + while n - len(bs) >= 1: + bs += read(_urandomfd, n - len(bs)) + finally: + close(_urandomfd) + return bs diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index cec023d..a618af4 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -497,6 +497,10 @@ class URandomTests (unittest.TestCase): self.assertEqual(len(os.urandom(10)), 10) self.assertEqual(len(os.urandom(100)), 100) self.assertEqual(len(os.urandom(1000)), 1000) + # see http://bugs.python.org/issue3708 + self.assertEqual(len(os.urandom(0.9)), 0) + self.assertEqual(len(os.urandom(1.1)), 1) + self.assertEqual(len(os.urandom(2.0)), 2) except NotImplementedError: pass |