summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-04-12 20:28:49 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2016-04-12 20:28:49 (GMT)
commit9d24271d86eb45ed569467cc8d6ef0f491778f26 (patch)
tree6c8a5136e291f8e4c60cbe2e1bda1f8f53432543 /Python
parentc6ec54d8eb47e685dfcc489d4c6e2a78bb817ef0 (diff)
downloadcpython-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.c17
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