git-getrandom
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Fri, 10 Jan 2020 22:21:25 +0000 (22:21 +0000)
committerAurelien Jarno <aurel32@debian.org>
Fri, 10 Jan 2020 22:21:25 +0000 (22:21 +0000)
commit c1f25758c353fcb16076512aba62746bff2e0d2d
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Fri Dec 13 03:23:14 2019 +0100

    hurd: Implement __close_nocancel_nostatus

    * sysdeps/mach/hurd/not-cancel.h: New file.

commit fe75ee0ca65536352fcdaebfbf39aac9bee271f0
Author: Andrew Eggenberger <andrew.eggenberger@gmail.com>
Date:   Tue Oct 29 23:19:32 2019 -0500

    hurd: add getrandom and getentropy implementations

    * sysdeps/mach/hurd/getentropy.c: New file.
    * sysdeps/mach/hurd/getrandom.c: Likewise.

commit 186e119bbd4a10895429ffe405ae96dc5c5634b8 (HEAD -> master, origin-rw/master)
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Fri Dec 13 03:32:21 2019 +0100

    hurd: Fix __close_nocancel_nostatus availability

    Not only libc/rtld use __close_nocancel_nostatus.

    * sysdeps/mach/hurd/Makefile [$(subdir) == io] (sysdep_routines): Add
    close_nocancel_nostatus.
    * sysdeps/mach/hurd/Versions (libc): Add __close_nocancel_nostatus to
    GLIBC_PRIVATE.
    * sysdeps/mach/hurd/not-cancel.h (__close_nocancel_nostatus): Declare
    function instead of defining inline.
    [IS_IN (libc) || IS_IN (rtld)] (__close_nocancel_nostatus): Make
    function hidden.
    * sysdeps/mach/hurd/close_nocancel_nostatus.c: New file.

commit 8eaf34eda256ba3647ed6e7ed5c7c9aa19955d17
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Fri Dec 13 10:10:59 2019 +0100

    hurd: Fix local PLT

    * include/sys/random.h (__getrandom): Add hidden prototype.
    * stdlib/getrandom.c (getrandom): Rename to hidden definition __getrandom.
    Add weak alias.
    * sysdeps/mach/hurd/getrandom.c (getrandom): Likewise.
    * sysdeps/unix/sysv/linux/getrandom.c (getrandom): Likewise.
    * sysdeps/mach/hurd/getentropy.c (getentropy): Use __getrandom instead of
    getrandom.

commit a45244ce127763872ff0b5743fb4ac8299ee9b28
Author: James Clarke <jrtc27@jrtc27.com>
Date:   Tue Dec 17 18:29:29 2019 +0000

    hurd: Make getrandom honour GRND_NONBLOCK

    * sysdeps/mach/hurd/getrandom.c (__getrandom): Open the random source
    with O_NONBLOCK when the GRND_NONBLOCK flag is provided.
    Message-Id: <20191217182929.90989-1-jrtc27@jrtc27.com>

Gbp-Pq: Topic hurd-i386
Gbp-Pq: Name git-getrandom.diff

include/sys/random.h [new file with mode: 0644]
stdlib/getrandom.c
sysdeps/mach/hurd/Makefile
sysdeps/mach/hurd/Versions
sysdeps/mach/hurd/close_nocancel_nostatus.c [new file with mode: 0644]
sysdeps/mach/hurd/getentropy.c [new file with mode: 0644]
sysdeps/mach/hurd/getrandom.c [new file with mode: 0644]
sysdeps/mach/hurd/not-cancel.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/getrandom.c

diff --git a/include/sys/random.h b/include/sys/random.h
new file mode 100644 (file)
index 0000000..6aa313d
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _SYS_RANDOM_H
+#include <stdlib/sys/random.h>
+
+# ifndef _ISOMAC
+
+extern ssize_t __getrandom (void *__buffer, size_t __length,
+                            unsigned int __flags) __wur;
+libc_hidden_proto (__getrandom)
+
+# endif /* !_ISOMAC */
+#endif
index 9fe6dda34d3f7fe99aaa66fc3a8ad4e540494c4a..d768c4870c668ccf371501a505378790c4f68d6e 100644 (file)
 /* Write up to LENGTH bytes of randomness starting at BUFFER.
    Return the number of bytes written, or -1 on error.  */
 ssize_t
-getrandom (void *buffer, size_t length, unsigned int flags)
+__getrandom (void *buffer, size_t length, unsigned int flags)
 {
   __set_errno (ENOSYS);
   return -1;
 }
-
 stub_warning (getrandom)
+
+libc_hidden_def (__getrandom)
+weak_alias (__getrandom, getrandom)
index 477984a0107c88b2748e644d3ea2231b7aa3c0c8..8e2dff7de43cbe6ff3ab301aa6be1b346d370e0c 100644 (file)
@@ -196,7 +196,7 @@ sysdep_routines += cthreads
 endif
 
 ifeq (io, $(subdir))
-sysdep_routines += f_setlk
+sysdep_routines += f_setlk close_nocancel_nostatus
 endif
 
 ifeq ($(subdir),sunrpc)
index f69d5fef671869e06ceb8fa6b02b59f78271775c..4dea3f8363c95cbb4991ab22a2e91f48b1165171 100644 (file)
@@ -13,6 +13,7 @@ libc {
     __libc_lock_self0;
 
     _dl_init_first;
+    __close_nocancel_nostatus;
   }
 }
 
diff --git a/sysdeps/mach/hurd/close_nocancel_nostatus.c b/sysdeps/mach/hurd/close_nocancel_nostatus.c
new file mode 100644 (file)
index 0000000..0c7c8ac
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright (C) 1991-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <unistd.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+#include <not-cancel.h>
+
+/* Close the file descriptor FD.  */
+void
+__close_nocancel_nostatus (int fd)
+{
+  HURD_FD_USE (fd, _hurd_fd_close (descriptor));
+}
+libc_hidden_def (__close_nocancel_nostatus)
diff --git a/sysdeps/mach/hurd/getentropy.c b/sysdeps/mach/hurd/getentropy.c
new file mode 100644 (file)
index 0000000..06175d9
--- /dev/null
@@ -0,0 +1,64 @@
+/* Implementation of getentropy based on getrandom.
+   Copyright (C) 2016-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sys/random.h>
+#include <assert.h>
+#include <errno.h>
+#include <unistd.h>
+
+/* Write LENGTH bytes of randomness starting at BUFFER.  Return 0 on
+   success and -1 on failure.  */
+int
+getentropy (void *buffer, size_t length)
+{
+  /* The interface is documented to return EIO for buffer lengths
+     longer than 256 bytes.  */
+  if (length > 256)
+    {
+      __set_errno (EIO);
+      return -1;
+    }
+
+  /* Try to fill the buffer completely.  Even with the 256 byte limit
+     above, we might still receive an EINTR error (when blocking
+     during boot).  */
+  void *end = buffer + length;
+  while (buffer < end)
+    {
+      /* NB: No cancellation point.  */
+      ssize_t bytes = __getrandom (buffer, end - buffer, 0);
+      if (bytes < 0)
+        {
+          if (errno == EINTR)
+            /* Try again if interrupted by a signal.  */
+            continue;
+          else
+            return -1;
+        }
+      if (bytes == 0)
+        {
+          /* No more bytes available.  This should not happen under
+             normal circumstances.  */
+          __set_errno (EIO);
+          return -1;
+        }
+      /* Try again in case of a short read.  */
+      buffer += bytes;
+    }
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/getrandom.c b/sysdeps/mach/hurd/getrandom.c
new file mode 100644 (file)
index 0000000..aac9c6f
--- /dev/null
@@ -0,0 +1,50 @@
+/* Hurdish implementation of getrandom
+   Copyright (C) 2016-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sys/random.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <not-cancel.h>
+
+/* Write up to LENGTH bytes of randomness starting at BUFFER.
+   Return the number of bytes written, or -1 on error.  */
+ssize_t
+__getrandom (void *buffer, size_t length, unsigned int flags)
+{
+  const char *random_source = "/dev/urandom";
+  int open_flags = O_RDONLY | O_CLOEXEC;
+  size_t amount_read;
+  int fd;
+
+  if (flags & GRND_RANDOM)
+    random_source = "/dev/random";
+
+  if (flags & GRND_NONBLOCK)
+    open_flags |= O_NONBLOCK;
+
+  fd = __open_nocancel(random_source, open_flags);
+  if (fd == -1)
+    return -1;
+
+  amount_read = __read_nocancel(fd, buffer, length);
+  __close_nocancel_nostatus(fd);
+  return amount_read;
+}
+
+libc_hidden_def (__getrandom)
+weak_alias (__getrandom, getrandom)
diff --git a/sysdeps/mach/hurd/not-cancel.h b/sysdeps/mach/hurd/not-cancel.h
new file mode 100644 (file)
index 0000000..c9a67c1
--- /dev/null
@@ -0,0 +1,62 @@
+/* Uncancelable versions of cancelable interfaces.  Hurd version.
+   Copyright (C) 2003-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef NOT_CANCEL_H
+# define NOT_CANCEL_H
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <time.h>
+#include <sys/uio.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+/* For now we have none.  Map the name to the normal functions.  */
+#define __open_nocancel(...) \
+  __open (__VA_ARGS__)
+#define __open64_nocancel(...) \
+  __open64 (__VA_ARGS__)
+#define __openat_nocancel(...) \
+  __openat (__VA_ARGS__)
+#define __openat64_nocancel(...) \
+  __openat64 (__VA_ARGS__)
+#define __close_nocancel(fd) \
+  __close (fd)
+
+void __close_nocancel_nostatus (int fd);
+
+#define __read_nocancel(fd, buf, n) \
+  __read (fd, buf, n)
+#define __pread64_nocancel(fd, buf, count, offset) \
+  __pread64 (fd, buf, count, offset)
+#define __write_nocancel(fd, buf, n) \
+  __write (fd, buf, n)
+#define __writev_nocancel_nostatus(fd, iov, n) \
+  (void) __writev (fd, iov, n)
+# define __waitpid_nocancel(pid, stat_loc, options) \
+  __waitpid (pid, stat_loc, options)
+#define __fcntl64_nocancel(fd, cmd, ...) \
+  __fcntl64 (fd, cmd, __VA_ARGS__)
+
+#if IS_IN (libc) || IS_IN (rtld)
+hidden_proto (__close_nocancel_nostatus)
+#endif
+
+#endif /* NOT_CANCEL_H  */
index 9d3d919c748d10c7debb6836575c3c44afa0d707..18525aa3cfd1273034047882b99562b86a156af6 100644 (file)
@@ -25,7 +25,7 @@
 /* Write up to LENGTH bytes of randomness starting at BUFFER.
    Return the number of bytes written, or -1 on error.  */
 ssize_t
-getrandom (void *buffer, size_t length, unsigned int flags)
+__getrandom (void *buffer, size_t length, unsigned int flags)
 {
   return SYSCALL_CANCEL (getrandom, buffer, length, flags);
 }
@@ -33,7 +33,7 @@ getrandom (void *buffer, size_t length, unsigned int flags)
 /* Always provide a definition, even if the kernel headers lack the
    system call number. */
 ssize_t
-getrandom (void *buffer, size_t length, unsigned int flags)
+__getrandom (void *buffer, size_t length, unsigned int flags)
 {
   /* Ideally, we would add a cancellation point here, but we currently
      cannot do so inside libc.  */
@@ -41,3 +41,5 @@ getrandom (void *buffer, size_t length, unsigned int flags)
   return -1;
 }
 #endif
+libc_hidden_def (__getrandom)
+weak_alias (__getrandom, getrandom)