Kaydet (Commit) 9d24271d authored tarafından Victor Stinner's avatar Victor Stinner

Fix os.urandom() on Solaris 11.3

Issue #26735: Fix os.urandom() on Solaris 11.3 and newer when reading more than
1,024 bytes: call getrandom() multiple times with a limit of 1024 bytes per
call.
üst c6ec54d8
...@@ -102,6 +102,10 @@ Core and Builtins ...@@ -102,6 +102,10 @@ Core and Builtins
Library Library
------- -------
- Issue #26735: Fix :func:`os.urandom` on Solaris 11.3 and newer when reading
more than 1,024 bytes: call ``getrandom()`` multiple times with a limit of
1024 bytes per call.
- Issue #16329: Add .webm to mimetypes.types_map. Patch by Giampaolo Rodola'. - Issue #16329: Add .webm to mimetypes.types_map. Patch by Giampaolo Rodola'.
- Issue #13952: Add .csv to mimetypes.types_map. Patch by Geoff Wilson. - Issue #13952: Add .csv to mimetypes.types_map. Patch by Geoff Wilson.
......
...@@ -131,16 +131,23 @@ py_getrandom(void *buffer, Py_ssize_t size, int raise) ...@@ -131,16 +131,23 @@ py_getrandom(void *buffer, Py_ssize_t size, int raise)
return 0; return 0;
while (0 < size) { while (0 < size) {
errno = 0; #ifdef sun
/* Issue #26735: On Solaris, getrandom() is limited to returning up
to 1024 bytes */
n = Py_MIN(size, 1024);
#else
n = size;
#endif
errno = 0;
#ifdef HAVE_GETRANDOM #ifdef HAVE_GETRANDOM
if (raise) { if (raise) {
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
n = getrandom(buffer, size, flags); n = getrandom(buffer, n, flags);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
} }
else { else {
n = getrandom(buffer, size, flags); n = getrandom(buffer, n, flags);
} }
#else #else
/* On Linux, use the syscall() function because the GNU libc doesn't /* On Linux, use the syscall() function because the GNU libc doesn't
...@@ -148,11 +155,11 @@ py_getrandom(void *buffer, Py_ssize_t size, int raise) ...@@ -148,11 +155,11 @@ py_getrandom(void *buffer, Py_ssize_t size, int raise)
* https://sourceware.org/bugzilla/show_bug.cgi?id=17252 */ * https://sourceware.org/bugzilla/show_bug.cgi?id=17252 */
if (raise) { if (raise) {
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
n = syscall(SYS_getrandom, buffer, size, flags); n = syscall(SYS_getrandom, buffer, n, flags);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
} }
else { else {
n = syscall(SYS_getrandom, buffer, size, flags); n = syscall(SYS_getrandom, buffer, n, flags);
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment