Use getentropy() for seeding PRNG
authorJanne Blomqvist <jb@gcc.gnu.org>
Mon, 13 Aug 2018 20:21:50 +0000 (23:21 +0300)
committerJanne Blomqvist <jb@gcc.gnu.org>
Mon, 13 Aug 2018 20:21:50 +0000 (23:21 +0300)
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.

From-SVN: r263522

libgfortran/ChangeLog
libgfortran/config.h.in
libgfortran/configure
libgfortran/configure.ac
libgfortran/intrinsics/random.c

index 850c8a1341b1a81075bccae36fef75faf02658cd..b8f238e777445cf07c3d1d8403be78a19c3c4f2c 100644 (file)
@@ -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'
index 0274e5d9c4ca7adcf6b3ee765a9abe0f2714b996..9ad64d57ab91f1cb8b61a56e39201a941faa91ee 100644 (file)
 /* 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
 
index 91fce8fecd080e7fa969c76c875482c9446331a4..42b4c0b5cb4dcdfbb811fe71919802fb8b13d980 100755 (executable)
@@ -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
@@ -16775,6 +16776,8 @@ done
 
 
 
+
+
 
 
 
index bf6d3634dda3acbc1d03d8c7825e60289967b116..900c7466decba1810833f276192b302b036d51d2 100644 (file)
@@ -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 \
index 234c5ff95fdaeb50c89ade0f7d5c742824d54383..229fa6995c0ba365de989c433e66bc606846aeec 100644 (file)
@@ -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;