]> granicus.if.org Git - python/commitdiff
Issue #23707: On UNIX, os.urandom() now calls the Python signal handler when
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 19 Mar 2015 22:36:33 +0000 (23:36 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 19 Mar 2015 22:36:33 +0000 (23:36 +0100)
read() is interrupted by a signal.

dev_urandom_python() now calls _Py_read() helper instead of calling directly
read().

Python/random.c

index c924323fdae7f6aba4c9391c7eec40614d5dc987..a281829f9744ee8143b8173fb5e7a12a0a12b113 100644 (file)
@@ -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;
 }