summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2018-11-25 22:51:57 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2018-11-25 22:51:57 +0900
commit03f40af361e7a1e57722fb4207929fdd1ad39263 (patch)
tree43a412c505489ad57805f5529739e1ebfe98eb79
parent6c30b13a91646d5b9ed26d12806850d33ec6f94b (diff)
Remove linux getrandom and use C++ stdlib instead
-rw-r--r--configure.ac16
-rw-r--r--src/Makefile.am4
-rw-r--r--src/SimpleRandomizer.cc25
-rw-r--r--src/getrandom_linux.c98
-rw-r--r--src/getrandom_linux.h49
5 files changed, 2 insertions, 190 deletions
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 <sys/syscall.h>
-#include <linux/random.h>
-]],
-[[
-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 <errno.h>
-# include <linux/errno.h>
-# include "getrandom_linux.h"
-#endif
-
namespace aria2 {
std::unique_ptr<SimpleRandomizer> SimpleRandomizer::randomizer_;
@@ -96,22 +90,7 @@ void SimpleRandomizer::getRandomBytes(unsigned char* buf, size_t len)
#ifdef __MINGW32__
BOOL r = CryptGenRandom(provider_, len, reinterpret_cast<BYTE*>(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<result_type*>(buf);
size_t q = len / sizeof(result_type);
auto dis = std::uniform_int_distribution<result_type>();
@@ -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 @@
-/* <!-- copyright */
-/*
- * aria2 - The high speed download utility
- *
- * Copyright (C) 2014 Nils Maier
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * In addition, as a special exception, the copyright holders give
- * permission to link the code of portions of this program with the
- * OpenSSL library under certain conditions as described in each
- * individual source file, and distribute linked combinations
- * including the two.
- * You must obey the GNU General Public License in all respects
- * for all of the code used other than OpenSSL. If you modify
- * file(s) with this exception, you may extend this exception to your
- * version of the file(s), but you are not obligated to do so. If you
- * do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source
- * files in the program, then also delete it here.
- */
-/* copyright --> */
-
-#define _GNUSOURCE
-#include <unistd.h>
-#include <sys/syscall.h>
-#include <linux/random.h>
-#include <sys/random.h>
-#include <errno.h>
-#include <linux/errno.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#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 @@
-/* <!-- copyright */
-/*
- * aria2 - The high speed download utility
- *
- * Copyright (C) 2014 Nils Maier
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * In addition, as a special exception, the copyright holders give
- * permission to link the code of portions of this program with the
- * OpenSSL library under certain conditions as described in each
- * individual source file, and distribute linked combinations
- * including the two.
- * You must obey the GNU General Public License in all respects
- * for all of the code used other than OpenSSL. If you modify
- * file(s) with this exception, you may extend this exception to your
- * version of the file(s), but you are not obligated to do so. If you
- * do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source
- * files in the program, then also delete it here.
- */
-/* copyright --> */
-
-#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 */