Hi Janne,
> PING
>
> On Fri, Aug 3, 2018 at 5:05 PM, Janne Blomqvist <[email protected]>
> wrote:
>
>> On Fri, Aug 3, 2018 at 4:28 PM, Jakub Jelinek <[email protected]> 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 <[email protected]>
* 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