From e7c82f20e3d7d7b47221b454508d07aefc14e7c0 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 16 Feb 2022 23:57:28 -0800 Subject: [PATCH] Directly use getrandom system call if possible --- native/jni/utils/misc.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/native/jni/utils/misc.cpp b/native/jni/utils/misc.cpp index 505c44042..3ac095b2f 100644 --- a/native/jni/utils/misc.cpp +++ b/native/jni/utils/misc.cpp @@ -35,17 +35,21 @@ int fork_no_orphan() { int gen_rand_str(char *buf, int len, bool varlen) { constexpr char ALPHANUM[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - static std::mt19937 gen([]{ - if (access("/dev/urandom", F_OK) != 0) - mknod("/dev/urandom", 0600 | S_IFCHR, makedev(1, 9)); - int fd = xopen("/dev/urandom", O_RDONLY | O_CLOEXEC); - unsigned seed; - xxread(fd, &seed, sizeof(seed)); + static mt19937 gen([]{ + mt19937::result_type seed; + if (syscall(__NR_getrandom, &seed, sizeof(seed), 0) < 0) { + // This can happen if device is running a too low Linux version + if (access("/dev/urandom", F_OK) != 0) + mknod("/dev/urandom", 0600 | S_IFCHR, makedev(1, 9)); + int fd = xopen("/dev/urandom", O_RDONLY | O_CLOEXEC); + xxread(fd, &seed, sizeof(seed)); + close(fd); + } return seed; }()); - std::uniform_int_distribution dist(0, sizeof(ALPHANUM) - 2); + uniform_int_distribution dist(0, sizeof(ALPHANUM) - 2); if (varlen) { - std::uniform_int_distribution len_dist(len / 2, len); + uniform_int_distribution len_dist(len / 2, len); len = len_dist(gen); } for (int i = 0; i < len - 1; ++i)