summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/configure.json10
-rw-r--r--src/corelib/global/minimum-linux.S12
-rw-r--r--src/corelib/global/qconfig-bootstrapped.h1
-rw-r--r--src/corelib/global/qrandom.cpp47
4 files changed, 59 insertions, 11 deletions
diff --git a/src/corelib/configure.json b/src/corelib/configure.json
index 0da3bff713..5e2cb025d3 100644
--- a/src/corelib/configure.json
+++ b/src/corelib/configure.json
@@ -163,6 +163,11 @@
"type": "compile",
"test": "unix/futimesat"
},
+ "getentropy": {
+ "label": "getentropy()",
+ "type": "compile",
+ "test": "unix/getentropy"
+ },
"posix-iconv": {
"label": "POSIX iconv",
"type": "compile",
@@ -277,6 +282,11 @@
"condition": "!config.win32 && !features.futimens && !features.futimes && tests.futimesat",
"output": [ "privateFeature" ]
},
+ "getentropy": {
+ "label": "getentropy()",
+ "condition": "config.unix && tests.getentropy",
+ "output": [ "privateFeature" ]
+ },
"glib": {
"label": "GLib",
"autoDetect": "!config.win32",
diff --git a/src/corelib/global/minimum-linux.S b/src/corelib/global/minimum-linux.S
index 3c0fa09a0a..3d97ea7ec8 100644
--- a/src/corelib/global/minimum-linux.S
+++ b/src/corelib/global/minimum-linux.S
@@ -37,6 +37,8 @@
**
****************************************************************************/
+#include "private/qglobal_p.h"
+
/* Copied from #include <elf.h>:
*/
#define ELF_NOTE_GNU "GNU"
@@ -76,7 +78,7 @@
/* Minimum Linux kernel version:
* We require the following features in Qt (unconditional, no fallback):
- * Feature Added in version
+ * Feature Added in version Macro
* - inotify_init1 before 2.6.12-rc12
* - futex(2) before 2.6.12-rc12
* - FUTEX_PRIVATE_FLAG 2.6.22
@@ -84,9 +86,15 @@
* - eventfd 2.6.23
* - pipe2 & dup3 2.6.27
* - accept4 2.6.28
+ * - getrandom 3.17 QT_CONFIG(getentropy)
*/
+#if QT_CONFIG(getentropy)
+ .long 3
+ .long 17
+ .long 0
+#else
.long 2
.long 6
.long 28
-
+#endif
diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h
index a6a56b5d59..7dba4ae5da 100644
--- a/src/corelib/global/qconfig-bootstrapped.h
+++ b/src/corelib/global/qconfig-bootstrapped.h
@@ -76,6 +76,7 @@
# define QT_FEATURE_alloca_malloc_h -1
#endif
#define QT_FEATURE_cxx11_random (QT_HAS_INCLUDE(<random>) ? 1 : -1)
+#define QT_FEATURE_getentropy -1
#define QT_FEATURE_iconv -1
#define QT_FEATURE_icu -1
#define QT_FEATURE_journald -1
diff --git a/src/corelib/global/qrandom.cpp b/src/corelib/global/qrandom.cpp
index 0fa67f69f8..daa9f25122 100644
--- a/src/corelib/global/qrandom.cpp
+++ b/src/corelib/global/qrandom.cpp
@@ -48,15 +48,19 @@
#include <errno.h>
-#if QT_CONFIG(cxx11_random)
-# include <random>
-# include "qdeadlinetimer.h"
-# include "qhashfunctions.h"
-#endif
+#if QT_CONFIG(getentropy)
+# include <sys/random.h>
+#else
+# if QT_CONFIG(cxx11_random)
+# include <random>
+# include "qdeadlinetimer.h"
+# include "qhashfunctions.h"
+# endif
-#if QT_CONFIG(sys_auxv)
-# include <sys/auxv.h>
-#endif
+# if QT_CONFIG(sys_auxv)
+# include <sys/auxv.h>
+# endif
+#endif // !QT_CONFIG(getentropy)
#ifdef Q_OS_UNIX
# include <fcntl.h>
@@ -111,7 +115,26 @@ out:
#endif
namespace {
-#ifdef Q_OS_UNIX
+#if QT_CONFIG(getentropy)
+class SystemRandom
+{
+public:
+ enum { EfficientBufferFill = true };
+ static qssize_t fillBuffer(void *buffer, qssize_t count) Q_DECL_NOTHROW
+ {
+ // getentropy can read at most 256 bytes, so break the reading
+ qssize_t read = 0;
+ while (count - read > 256) {
+ // getentropy can't fail under normal circumstances
+ read += getentropy(reinterpret_cast<uchar *>(buffer) + read, 256);
+ }
+
+ getentropy(reinterpret_cast<uchar *>(buffer) + read, count - read);
+ return count;
+ }
+};
+
+#elif defined(Q_OS_UNIX)
class SystemRandom
{
static QBasicAtomicInt s_fdp1; // "file descriptor plus 1"
@@ -208,6 +231,12 @@ static void fallback_fill(quint32 *ptr, qssize_t left) Q_DECL_NOTHROW
return value;
});
}
+#elif QT_CONFIG(getentropy)
+static void fallback_update_seed(unsigned) {}
+static void fallback_fill(quint32 *, qssize_t) Q_DECL_NOTHROW
+{
+ // no fallback necessary, getentropy cannot fail under normal circumstances
+}
#elif defined(Q_OS_BSD4)
static void fallback_update_seed(unsigned) {}
static void fallback_fill(quint32 *ptr, qssize_t left) Q_DECL_NOTHROW