From d712203d17d406b3ebdb1276e5f1694a2a7db120 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Tue, 2 Sep 2008 05:36:11 +0000 Subject: Issue #3708: os.urandom no longer goes into an infinite loop when passed a non-integer floating point number. --- Lib/os.py | 12 +++++++----- Lib/test/test_os.py | 4 ++++ Misc/NEWS | 3 +++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib/os.py b/Lib/os.py index 715ff20..abbadc4 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -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 diff --git a/Misc/NEWS b/Misc/NEWS index a107473..00dfd33 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -72,6 +72,9 @@ Library - Issue #3703: _fileio.FileIO gave unhelpful error message when trying to open a directory. +- Issue #3708: os.urandom no longer goes into an infinite loop when passed a + non-integer floating point number. + Extension Modules ----------------- -- cgit v0.12