]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
hurd: Make getrandom a stub inside the random translator
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Thu, 30 Dec 2021 20:25:24 +0000 (21:25 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Fri, 31 Dec 2021 07:54:41 +0000 (08:54 +0100)
glibc uses /dev/urandom for getrandom(), and from version 2.34 malloc
initialization uses it. We have to detect when we are running the random
translator itself, in which case we can't read ourself.

sysdeps/mach/hurd/getrandom.c

index 645f2930b7b1d07dbbc6b939a41788503812943c..24f9ac60f7a590e6d133c160e20494dc9a8cdc88 100644 (file)
@@ -21,6 +21,8 @@
 #include <unistd.h>
 #include <not-cancel.h>
 
+extern char *trivfs_server_name __attribute__((weak));
+
 /* Write up to LENGTH bytes of randomness starting at BUFFER.
    Return the number of bytes written, or -1 on error.  */
 ssize_t
@@ -31,6 +33,17 @@ __getrandom (void *buffer, size_t length, unsigned int flags)
   size_t amount_read;
   int fd;
 
+  if (&trivfs_server_name && trivfs_server_name
+      && trivfs_server_name[0] == 'r'
+      && trivfs_server_name[1] == 'a'
+      && trivfs_server_name[2] == 'n'
+      && trivfs_server_name[3] == 'd'
+      && trivfs_server_name[4] == 'o'
+      && trivfs_server_name[5] == 'm'
+      && trivfs_server_name[6] == '\0')
+    /* We are random, don't try to read ourselves!  */
+    return length;
+
   if (flags & GRND_RANDOM)
     random_source = "/dev/random";