diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2015-03-20 00:10:23 +0100 |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2015-03-20 00:10:23 +0100 |
commit | 484b9f3b9983e3c05f1d84ce9581fe95b0bf84b9 (patch) | |
tree | 05d0aa9100e7f7471c408ac3df0ae71ae7002fba /Python/random.c | |
parent | 31084ba52856329b972b84299b438bf5b73be292 (diff) | |
parent | c1cf4f7ef9e6b295d397bdecbc1a2f9f8f529a14 (diff) | |
download | cpython-git-484b9f3b9983e3c05f1d84ce9581fe95b0bf84b9.tar.gz |
Merge
Diffstat (limited to 'Python/random.c')
-rw-r--r-- | Python/random.c | 38 |
1 files changed, 15 insertions, 23 deletions
diff --git a/Python/random.c b/Python/random.c index 10fc505e0f..a281829f97 100644 --- a/Python/random.c +++ b/Python/random.c @@ -166,10 +166,6 @@ dev_urandom_noraise(unsigned char *buffer, Py_ssize_t size) assert (0 < size); - fd = _Py_open_noraise("/dev/urandom", O_RDONLY); - if (fd < 0) - Py_FatalError("Failed to open /dev/urandom"); - #ifdef HAVE_GETRANDOM_SYSCALL if (py_getrandom(buffer, size, 0) == 1) return; @@ -177,6 +173,10 @@ dev_urandom_noraise(unsigned char *buffer, Py_ssize_t size) * on reading /dev/urandom */ #endif + fd = _Py_open_noraise("/dev/urandom", O_RDONLY); + if (fd < 0) + Py_FatalError("Failed to open /dev/urandom"); + while (0 < size) { do { @@ -262,29 +262,21 @@ dev_urandom_python(char *buffer, Py_ssize_t size) } } - Py_BEGIN_ALLOW_THREADS do { - do { - n = read(fd, buffer, (size_t)size); - } while (n < 0 && errno == EINTR); - if (n <= 0) - break; + n = _Py_read(fd, buffer, (size_t)size); + if (n == -1) + return -1; + if (n == 0) { + PyErr_Format(PyExc_RuntimeError, + "Failed to read %zi bytes from /dev/urandom", + size); + return -1; + } + buffer += n; - size -= (Py_ssize_t)n; + size -= n; } while (0 < size); - Py_END_ALLOW_THREADS - if (n <= 0) - { - /* stop on error or if read(size) returned 0 */ - if (n < 0) - PyErr_SetFromErrno(PyExc_OSError); - else - PyErr_Format(PyExc_RuntimeError, - "Failed to read %zi bytes from /dev/urandom", - size); - return -1; - } return 0; } |