aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>2018-08-13 20:21:50 +0000
committerjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>2018-08-13 20:21:50 +0000
commit44ab5f2e6796b082d0aa37014e10e499b80e0a5f (patch)
tree0cb0150a31538dfc107e19dbeff59fef4420ae6f
parent1cc2a7b8b98c12fe577ecd17bdf64d622ff0c387 (diff)
Use getentropy() for seeding PRNG
The getentropy function, found on Linux, OpenBSD, and recently also FreeBSD, can be used to get random bytes to initialize the PRNG. It is similar to the traditional way of reading from /dev/urandom, but being a system call rather than a special file, it doesn't suffer from problems like running out of file descriptors, or failure when running in a container where /dev/urandom may not be available. Regtested on x86_64-pc-linux-gnu, Ok for trunk? 2018-08-13 Janne Blomqvist <jb@gcc.gnu.org> * configure.ac: Check for getentropy. * intrinsics/random.c (getosrandom): Use getentropy if available. * config.h.in: Regenerated. * configure: Regenerated. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@263522 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/config.h.in3
-rwxr-xr-xlibgfortran/configure7
-rw-r--r--libgfortran/configure.ac3
-rw-r--r--libgfortran/intrinsics/random.c9
5 files changed, 21 insertions, 8 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 850c8a1341b..b8f238e7774 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2018-08-13 Janne Blomqvist <jb@gcc.gnu.org>
+
+ * configure.ac: Check for getentropy.
+ * intrinsics/random.c (getosrandom): Use getentropy if available.
+ * config.h.in: Regenerated.
+ * configure: Regenerated.
+
2018-07-31 Andre Vieira <andre.simoesdiasvieira@arm.com>
Revert 'AsyncI/O patch committed'
diff --git a/libgfortran/config.h.in b/libgfortran/config.h.in
index 0274e5d9c4c..9ad64d57ab9 100644
--- a/libgfortran/config.h.in
+++ b/libgfortran/config.h.in
@@ -453,6 +453,9 @@
/* Define to 1 if you have the `getegid' function. */
#undef HAVE_GETEGID
+/* Define to 1 if you have the `getentropy' function. */
+#undef HAVE_GETENTROPY
+
/* Define to 1 if you have the `geteuid' function. */
#undef HAVE_GETEUID
diff --git a/libgfortran/configure b/libgfortran/configure
index 91fce8fecd0..42b4c0b5cb4 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -2570,6 +2570,7 @@ as_fn_append ac_func_list " snprintf"
as_fn_append ac_func_list " ftruncate"
as_fn_append ac_func_list " chsize"
as_fn_append ac_func_list " chdir"
+as_fn_append ac_func_list " getentropy"
as_fn_append ac_func_list " getlogin"
as_fn_append ac_func_list " gethostname"
as_fn_append ac_func_list " kill"
@@ -12512,7 +12513,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12515 "configure"
+#line 12516 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -12618,7 +12619,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12621 "configure"
+#line 12622 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -16778,6 +16779,8 @@ done
+
+
fi
# Check strerror_r, cannot be above as versions with two and three arguments exist
diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
index bf6d3634dda..900c7466dec 100644
--- a/libgfortran/configure.ac
+++ b/libgfortran/configure.ac
@@ -312,7 +312,8 @@ if test "${hardwire_newlib:-0}" -eq 1; then
fi
else
AC_CHECK_FUNCS_ONCE(getrusage times mkstemp strtof strtold snprintf \
- ftruncate chsize chdir getlogin gethostname kill link symlink sleep ttyname \
+ ftruncate chsize chdir getentropy getlogin gethostname kill link symlink \
+ sleep ttyname \
alarm access fork setmode fcntl \
gettimeofday stat fstat lstat getpwuid vsnprintf dup \
getcwd localtime_r gmtime_r getpwuid_r ttyname_r clock_gettime \
diff --git a/libgfortran/intrinsics/random.c b/libgfortran/intrinsics/random.c
index 234c5ff95fd..229fa6995c0 100644
--- a/libgfortran/intrinsics/random.c
+++ b/libgfortran/intrinsics/random.c
@@ -310,11 +310,10 @@ getosrandom (void *buf, size_t buflen)
rand_s (&b[i]);
return buflen;
#else
- /*
- TODO: When glibc adds a wrapper for the getrandom() system call
- on Linux, one could use that.
-
- TODO: One could use getentropy() on OpenBSD. */
+#ifdef HAVE_GETENTROPY
+ if (getentropy (buf, buflen) == 0)
+ return 0;
+#endif
int flags = O_RDONLY;
#ifdef O_CLOEXEC
flags |= O_CLOEXEC;