diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-04-12 20:28:49 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-04-12 20:28:49 (GMT) |
commit | 9d24271d86eb45ed569467cc8d6ef0f491778f26 (patch) | |
tree | 6c8a5136e291f8e4c60cbe2e1bda1f8f53432543 /Python | |
parent | c6ec54d8eb47e685dfcc489d4c6e2a78bb817ef0 (diff) | |
download | cpython-9d24271d86eb45ed569467cc8d6ef0f491778f26.zip cpython-9d24271d86eb45ed569467cc8d6ef0f491778f26.tar.gz cpython-9d24271d86eb45ed569467cc8d6ef0f491778f26.tar.bz2 |
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.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/random.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/Python/random.c b/Python/random.c index 772bfef..79157b8 100644 --- a/Python/random.c +++ b/Python/random.c @@ -131,16 +131,23 @@ py_getrandom(void *buffer, Py_ssize_t size, int raise) return 0; 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 if (raise) { Py_BEGIN_ALLOW_THREADS - n = getrandom(buffer, size, flags); + n = getrandom(buffer, n, flags); Py_END_ALLOW_THREADS } else { - n = getrandom(buffer, size, flags); + n = getrandom(buffer, n, flags); } #else /* 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) * https://sourceware.org/bugzilla/show_bug.cgi?id=17252 */ if (raise) { Py_BEGIN_ALLOW_THREADS - n = syscall(SYS_getrandom, buffer, size, flags); + n = syscall(SYS_getrandom, buffer, n, flags); Py_END_ALLOW_THREADS } else { - n = syscall(SYS_getrandom, buffer, size, flags); + n = syscall(SYS_getrandom, buffer, n, flags); } #endif |