From: Victor Stinner Date: Thu, 19 Mar 2015 22:36:33 +0000 (+0100) Subject: Issue #23707: On UNIX, os.urandom() now calls the Python signal handler when X-Git-Tag: v3.5.0a3~127^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c9382eb7ae26dd72ad2ee9736584c2ad6d109085;p=python 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(). --- 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; }