Hi Janne, > PING > > On Fri, Aug 3, 2018 at 5:05 PM, Janne Blomqvist <blomqvist.ja...@gmail.com> > wrote: > >> On Fri, Aug 3, 2018 at 4:28 PM, Jakub Jelinek <ja...@redhat.com> wrote: >> >>> On Fri, Aug 03, 2018 at 04:19:03PM +0300, Janne Blomqvist wrote: >>> > --- a/libgfortran/intrinsics/random.c >>> > +++ b/libgfortran/intrinsics/random.c >>> > @@ -309,12 +309,9 @@ getosrandom (void *buf, size_t buflen) >>> > for (size_t i = 0; i < buflen / sizeof (unsigned int); i++) >>> > rand_s (&b[i]); >>> > return buflen; >>> > +#elif defined(HAVE_GETENTROPY) >>> > + return getentropy (buf, buflen); >>> > #else >>> >>> I wonder if it wouldn't be better to use getentropy only if it is >>> successful >>> and fall back to whatever you were doing before. >>> >>> E.g. on Linux, I believe getentropy in glibc just uses the getrandom >>> syscall, which has only been introduced in Linux kernel 3.17. >>> >> >> Yes, that is my understanding as well. >> >> >>> So, if somebody is running glibc 2.25 or later on kernel < 3.17, it will >>> fail, even though reads from /dev/urandom could work. >>> >> >> Hmm, fair enough. So replace the random.c part of the patch with >> >> 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; >> >> >> >> Just to be sure, I regtested this slightly modified patch as well. Ok for >> trunk?
the patch broke Solaris 11.3+ bootstrap: /vol/gcc/src/hg/trunk/local/libgfortran/intrinsics/random.c: In function 'getosrandom': /vol/gcc/src/hg/trunk/local/libgfortran/intrinsics/random.c:314:7: error: implicit declaration of function 'getentropy'; did you mean 'get_nprocs'? [-Werror=implicit-function-declaration] 314 | if (getentropy (buf, buflen) == 0) | ^~~~~~~~~~ | get_nprocs According to the manpage, one needs to include <sys/random.h> to get the getentropy declaration. Fixed as follows. Bootstraps on i386-pc-solaris2.11, i386-pc-solaris2.10 (which lacks getentropy), sparc-sun-solaris2.11, and x86_64-pc-linux-gnu still running, but all already into make check. Ok for mainline? Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University 2018-08-14 Rainer Orth <r...@cebitec.uni-bielefeld.de> * configure.ac: Check for <sys/random.h>. * configure, config.h.in: Regenerate. * intrinsics/random.c [HAVE_SYS_RANDOM_H]: Include <sys/random.h>.
# HG changeset patch # Parent 8cc4b3b19e87eb3221d688c25887efd199d44f89 Include <sys/random.h> for getentropy on Solaris diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac --- a/libgfortran/configure.ac +++ b/libgfortran/configure.ac @@ -275,8 +275,9 @@ AC_TYPE_UINTPTR_T AC_CHECK_TYPES([ptrdiff_t]) # check header files (we assume C89 is available, so don't check for that) -AC_CHECK_HEADERS_ONCE(unistd.h sys/time.h sys/times.h sys/resource.h \ -sys/types.h sys/stat.h sys/wait.h floatingpoint.h ieeefp.h fenv.h fptrap.h \ +AC_CHECK_HEADERS_ONCE(unistd.h sys/random.h sys/time.h sys/times.h \ +sys/resource.h sys/types.h sys/stat.h sys/wait.h \ +floatingpoint.h ieeefp.h fenv.h fptrap.h \ fpxcp.h pwd.h complex.h xlocale.h) GCC_HEADER_STDINT(gstdint.h) diff --git a/libgfortran/intrinsics/random.c b/libgfortran/intrinsics/random.c --- a/libgfortran/intrinsics/random.c +++ b/libgfortran/intrinsics/random.c @@ -37,6 +37,9 @@ see the files COPYING3 and COPYING.RUNTI #include <sys/stat.h> #include <fcntl.h> #include "time_1.h" +#ifdef HAVE_SYS_RANDOM_H +#include <sys/random.h> +#endif #ifdef __MINGW32__ #define HAVE_GETPID 1