From 03f40af361e7a1e57722fb4207929fdd1ad39263 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 25 Nov 2018 22:51:57 +0900 Subject: [PATCH] Remove linux getrandom and use C++ stdlib instead --- configure.ac | 16 ------- src/Makefile.am | 4 -- src/SimpleRandomizer.cc | 25 +---------- src/getrandom_linux.c | 98 ----------------------------------------- src/getrandom_linux.h | 49 --------------------- 5 files changed, 2 insertions(+), 190 deletions(-) delete mode 100644 src/getrandom_linux.c delete mode 100644 src/getrandom_linux.h diff --git a/configure.ac b/configure.ac index 1ab1d32f..ac767867 100644 --- a/configure.ac +++ b/configure.ac @@ -754,7 +754,6 @@ AC_CHECK_FUNCS([__argz_count \ gethostbyname \ getifaddrs \ getpagesize \ - getrandom \ memchr \ memmove \ mempcpy \ @@ -790,21 +789,6 @@ AC_CHECK_FUNCS([__argz_count \ utime \ utimes]) -AC_MSG_CHECKING([for getrandom linux syscall interface]) -AC_LINK_IFELSE([AC_LANG_PROGRAM([[ -#include -#include -]], -[[ -int x = GRND_NONBLOCK; -int y = (int)SYS_getrandom; -]])], - [have_getrandom_interface=yes - AC_DEFINE([HAVE_GETRANDOM_INTERFACE], [1], [Define to 1 if getrandom linux syscall interface is available.])], - [have_getrandom_interface=no]) -AC_MSG_RESULT([$have_getrandom_interface]) -AM_CONDITIONAL([HAVE_GETRANDOM_INTERFACE], [test "x$have_getrandom_interface" = "xyes"]) - dnl Put tcmalloc/jemalloc checks after the posix_memalign check. dnl These libraries may implement posix_memalign, while the usual CRT may not dnl (e.g. mingw). Since we aren't including the corresponding library headers diff --git a/src/Makefile.am b/src/Makefile.am index d61fa509..cb6e3b7c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -673,10 +673,6 @@ if HAVE_KQUEUE SRCS += KqueueEventPoll.cc KqueueEventPoll.h endif # HAVE_KQUEUE -if HAVE_GETRANDOM_INTERFACE -SRCS += getrandom_linux.c getrandom_linux.h -endif # HAVE_GETRANDOM_INTERFACE - if HAVE_LIBUV SRCS += LibuvEventPoll.cc LibuvEventPoll.h endif # HAVE_LIBUV diff --git a/src/SimpleRandomizer.cc b/src/SimpleRandomizer.cc index 539855e5..8a055d66 100644 --- a/src/SimpleRandomizer.cc +++ b/src/SimpleRandomizer.cc @@ -45,12 +45,6 @@ #include "LogFactory.h" #include "fmt.h" -#ifdef HAVE_GETRANDOM_INTERFACE -# include -# include -# include "getrandom_linux.h" -#endif - namespace aria2 { std::unique_ptr SimpleRandomizer::randomizer_; @@ -96,22 +90,7 @@ void SimpleRandomizer::getRandomBytes(unsigned char* buf, size_t len) #ifdef __MINGW32__ BOOL r = CryptGenRandom(provider_, len, reinterpret_cast(buf)); assert(r); -#else // ! __MINGW32__ -# if defined(HAVE_GETRANDOM_INTERFACE) - static bool have_random_support = true; - if (have_random_support) { - auto rv = getrandom_linux(buf, len); - if (rv != -1) { - // getrandom is not supposed to fail, ever, so, we want to assert here. - assert(rv >= 0 && (size_t)rv == len); - return; - } - have_random_support = false; - A2_LOG_INFO("Disabled getrandom support, because kernel does not " - "implement this feature (ENOSYS)"); - } -// Fall through to generic implementation -# endif // defined(HAVE_GETRANDOM_INTERFACE) +#else // ! __MINGW32__ auto ubuf = reinterpret_cast(buf); size_t q = len / sizeof(result_type); auto dis = std::uniform_int_distribution(); @@ -121,7 +100,7 @@ void SimpleRandomizer::getRandomBytes(unsigned char* buf, size_t len) const size_t r = len % sizeof(result_type); auto last = dis(gen_); memcpy(ubuf, &last, r); -#endif // ! __MINGW32__ +#endif // ! __MINGW32__ } } // namespace aria2 diff --git a/src/getrandom_linux.c b/src/getrandom_linux.c deleted file mode 100644 index f9bcfecf..00000000 --- a/src/getrandom_linux.c +++ /dev/null @@ -1,98 +0,0 @@ -/* */ - -#define _GNUSOURCE -#include -#include -#include -#include -#include -#include -#include -#include - -#include "config.h" -#include "getrandom_linux.h" - -int getrandom_linux(void* buf, size_t buflen) -{ - int rv = 0; - uint8_t* p = buf; - - /* Loop while we did not fully retrieve what the user asked for. - * This may happen in particular when a call was EINTRupted. - */ - while (buflen) { - int read; -#ifdef HAVE_GETRANDOM - /* libc already has support */ - read = getrandom(p, buflen, 0); -#else // HAVE_GETRANDOM - /* libc has no support, make the syscall ourselves */ - read = syscall(SYS_getrandom, p, buflen, 0); - /* Some libc impl. might mess -ERESTART up */ - if (read == -EINTR || read == -ERESTART) { - /* ERESTART, like EINTR, should restart the call, later, so handle both - * the same way. - */ - errno = EINTR; - read = -1; - } - /* Some other non-interrupted error happened, put error code into errno and - * switch read to -1 (return value). - */ - if (read < -1) { - errno = -read; - read = -1; - } -#endif // HAVE_GETRANDOM - if (read < 0) { - if (errno == EINTR) { - /* Restart call */ - continue; - } - /* Call failed, return -1, errno should be set up correctly at this - * point. - */ - return -1; - } - /* We got some more randomness */ - p += read; - rv += read; - buflen -= read; - } - - return rv; -} diff --git a/src/getrandom_linux.h b/src/getrandom_linux.h deleted file mode 100644 index 3c8a6d69..00000000 --- a/src/getrandom_linux.h +++ /dev/null @@ -1,49 +0,0 @@ -/* */ - -#ifndef D_GETRANDOM_LINUX_H -#define D_GETRANDOM_LINUX_H - -#ifdef __cplusplus -extern "C" { -#endif - -int getrandom_linux(void* buf, size_t buflen); - -#ifdef __cplusplus -} -#endif - -#endif /* D_GETRANDOM_LINUX_H */