On Fri, 7 Jul 2023, Anton Khirnov wrote:

It is a better interface for /dev/u?random on Linux, which avoids the
issues associated with opening files.


getrandom() actually have the same problem as read(). It can read less than requested. So you should use it in a loop in that case or if it returns EINTR.

Regards,
Marton


---
configure               |  2 ++
libavutil/random_seed.c | 15 +++++++++++++++
2 files changed, 17 insertions(+)

diff --git a/configure b/configure
index d6e78297fe..a4b09577cf 100755
--- a/configure
+++ b/configure
@@ -2310,6 +2310,7 @@ SYSTEM_FUNCS="
    getauxval
    getenv
    gethrtime
+    getrandom
    getopt
    GetModuleHandle
    GetProcessAffinityMask
@@ -6387,6 +6388,7 @@ check_func  fcntl
check_func  fork
check_func  gethrtime
check_func  getopt
+check_func_headers "sys/random.h" getrandom
check_func  getrusage
check_func  gettimeofday
check_func  isatty
diff --git a/libavutil/random_seed.c b/libavutil/random_seed.c
index 2980e565e0..9a3a5aa133 100644
--- a/libavutil/random_seed.c
+++ b/libavutil/random_seed.c
@@ -35,6 +35,9 @@
#elif CONFIG_OPENSSL
#include <openssl/rand.h>
#endif
+#if HAVE_GETRANDOM
+#include <sys/random.h>
+#endif
#include <fcntl.h>
#include <math.h>
#include <time.h>
@@ -51,6 +54,7 @@
#define TEST 0
#endif

+#if !HAVE_GETRANDOM
static int read_random(uint8_t *dst, size_t len, const char *file)
{
#if HAVE_UNISTD_H
@@ -70,6 +74,7 @@ static int read_random(uint8_t *dst, size_t len, const char 
*file)
    return AVERROR(ENOSYS);
#endif
}
+#endif

static uint32_t get_generic_seed(void)
{
@@ -147,7 +152,17 @@ int av_random_bytes(uint8_t* buf, size_t len)
    return 0;
#endif

+    // getrandom() is a better interface for /dev/(u)random on Linux,
+    // so it makes no sense to try both
+#if HAVE_GETRANDOM
+    {
+        ssize_t read = getrandom(buf, len, GRND_NONBLOCK);
+        err = read < 0    ? AVERROR(errno)  :
+              read != len ? AVERROR_UNKNOWN : 0;
+    }
+#else
    err = read_random(buf, len, "/dev/urandom");
+#endif
    if (!err)
        return err;

--
2.40.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to