diff options
Diffstat (limited to 'src/corelib/global')
-rw-r--r-- | src/corelib/global/minimum-linux.S | 12 | ||||
-rw-r--r-- | src/corelib/global/qconfig-bootstrapped.h | 1 | ||||
-rw-r--r-- | src/corelib/global/qrandom.cpp | 47 |
3 files changed, 49 insertions, 11 deletions
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 |