]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
util: add support for getrandom()
authorMiroslav Lichvar <mlichvar@redhat.com>
Thu, 15 Jun 2017 15:35:33 +0000 (17:35 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Tue, 27 Jun 2017 13:29:01 +0000 (15:29 +0200)
Add support for the Linux getrandom() system call, which is available
in glibc since 2.25.

configure
sysincl.h
util.c

index d10cf33df2d4fb9c4bec06110b3da7e68dbf12f0..7be160e3ae8bceaffe9b9983c395cf791b6d9d82 100755 (executable)
--- a/configure
+++ b/configure
@@ -633,6 +633,11 @@ if test_code 'arc4random_buf()' 'stdlib.h' '' '' 'arc4random_buf(NULL, 0);'; the
   add_def HAVE_ARC4RANDOM
 fi
 
+if test_code 'getrandom()' 'stdlib.h sys/random.h' '' '' \
+    'getrandom(NULL, 256, 0);'; then
+  add_def HAVE_GETRANDOM
+fi
+
 RECVMMSG_CODE='
   struct mmsghdr hdr;
   return !recvmmsg(0, &hdr, 1, MSG_DONTWAIT, 0);'
index 1caf5869c8eb3b7344e0bbd475fa9f54413b11a8..0e1c65ad25d84b54cd02afd7bf0b697181f5a46f 100644 (file)
--- a/sysincl.h
+++ b/sysincl.h
@@ -76,4 +76,8 @@
 #include <arpa/inet.h>
 #endif
 
+#ifdef HAVE_GETRANDOM
+#include <sys/random.h>
+#endif
+
 #endif /* GOT_SYSINCL_H */
diff --git a/util.c b/util.c
index c336e36f5776edf4fa820c0a0968b240c43857b5..ae530c9d592c56f742a40492a3cc8ace2ff263a4 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1195,11 +1195,44 @@ UTI_GetRandomBytesUrandom(void *buf, unsigned int len)
 
 /* ================================================== */
 
+#ifdef HAVE_GETRANDOM
+static void
+get_random_bytes_getrandom(char *buf, unsigned int len)
+{
+  static char rand_buf[256];
+  static unsigned int available = 0, disabled = 0;
+  unsigned int i;
+
+  for (i = 0; i < len; i++) {
+    if (!available) {
+      if (disabled)
+        break;
+
+      if (getrandom(rand_buf, sizeof (rand_buf), 0) != sizeof (rand_buf)) {
+        disabled = 1;
+        break;
+      }
+
+      available = sizeof (rand_buf);
+    }
+
+    buf[i] = rand_buf[--available];
+  }
+
+  if (i < len)
+    UTI_GetRandomBytesUrandom(buf, len);
+}
+#endif
+
+/* ================================================== */
+
 void
 UTI_GetRandomBytes(void *buf, unsigned int len)
 {
 #ifdef HAVE_ARC4RANDOM
   arc4random_buf(buf, len);
+#elif defined(HAVE_GETRANDOM)
+  get_random_bytes_getrandom(buf, len);
 #else
   UTI_GetRandomBytesUrandom(buf, len);
 #endif