Skip to content

Commit

Permalink
Switch Linux getrandom() usage to non-blocking mode, continuing to
Browse files Browse the repository at this point in the history
use fallback mechanims if unsuccessful.

The design of Linux getrandom is broken.  It has an
uninitialized phase coupled with blocking behaviour, which
is unacceptable from within a library at boot time without
possible recovery.
ok deraadt@ jsing@
  • Loading branch information
bob-beck committed Apr 29, 2017
1 parent 2f82bf5 commit edb2eeb
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions lib/libcrypto/arc4random/getentropy_linux.c
@@ -1,4 +1,4 @@
/* $OpenBSD: getentropy_linux.c,v 1.43 2016/08/07 03:27:21 tb Exp $ */
/* $OpenBSD: getentropy_linux.c,v 1.44 2017/04/29 18:43:31 beck Exp $ */

/*
* Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
Expand Down Expand Up @@ -96,13 +96,16 @@ getentropy(void *buf, size_t len)

#ifdef SYS_getrandom
/*
* Try descriptor-less getrandom()
* Try descriptor-less getrandom(), in non-blocking mode.
*
* The design of Linux getrandom is broken. It has an
* uninitialized phase coupled with blocking behaviour, which
* is unacceptable from within a library at boot time without
* possible recovery. See http://bugs.python.org/issue26839#msg267745
*/
ret = getentropy_getrandom(buf, len);
if (ret != -1)
return (ret);
if (errno != ENOSYS)
return (-1);
#endif

/*
Expand Down Expand Up @@ -156,7 +159,7 @@ getentropy(void *buf, size_t len)
* - Do the best under the circumstances....
*
* This code path exists to bring light to the issue that Linux
* does not provide a failsafe API for entropy collection.
* still does not provide a failsafe API for entropy collection.
*
* We hope this demonstrates that Linux should either retain their
* sysctl ABI, or consider providing a new failsafe API which
Expand Down Expand Up @@ -199,7 +202,7 @@ getentropy_getrandom(void *buf, size_t len)
if (len > 256)
return (-1);
do {
ret = syscall(SYS_getrandom, buf, len, 0);
ret = syscall(SYS_getrandom, buf, len, GRND_NONBLOCK);
} while (ret == -1 && errno == EINTR);

if (ret != len)
Expand Down

0 comments on commit edb2eeb

Please sign in to comment.