summaryrefslogtreecommitdiff
path: root/Python/random.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-03-19 23:36:33 +0100
committerVictor Stinner <victor.stinner@gmail.com>2015-03-19 23:36:33 +0100
commitb63df00ad9222e7a31bf2fc6fba43183a41dc841 (patch)
treeecefc89db3a430a3fa06ada675faddafc66fd542 /Python/random.c
parent24d59e05262a76b67329b649b6d67b091ab3491f (diff)
downloadcpython-b63df00ad9222e7a31bf2fc6fba43183a41dc841.tar.gz
Issue #23707: On UNIX, os.urandom() now calls the Python signal handler when
read() is interrupted by a signal. dev_urandom_python() now calls _Py_read() helper instead of calling directly read().
Diffstat (limited to 'Python/random.c')
-rw-r--r--Python/random.c30
1 files changed, 11 insertions, 19 deletions
diff --git a/Python/random.c b/Python/random.c
index c924323fda..a281829f97 100644
--- a/Python/random.c
+++ b/Python/random.c
@@ -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;
}