From ac0997ea32a465a6b0db7b782bb8d4d07952365a Mon Sep 17 00:00:00 2001 From: Gao Xiang Date: Mon, 29 Jul 2024 19:25:24 +0800 Subject: [PATCH] erofs-utils: lib: uuid: fix compilation error if __NR_getrandom doesn't exist MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Let's use rand() for insecure randomness without getrandom() support on very old kernels to resolve issues as below: uuid.c: In function ‘s_getrandom’: uuid.c:44:32: error: ‘__NR_getrandom’ undeclared (first use in this function); did you mean ‘s_getrandom’? 44 | ssize_t r = (ssize_t)syscall(__NR_getrandom, out, size, flags); | ^~~~~~~~~~~~~~ | s_getrandom I'm not sure who cares since most users just use `--with-uuid` instead. Fixes: 5de439566bc5 ("erofs-utils: Provide identical functionality without libuuid") Reviewed-by: Sandeep Dhavale Signed-off-by: Gao Xiang Link: https://lore.kernel.org/r/20240729112524.930460-1-hsiangkao@linux.alibaba.com --- lib/uuid.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/uuid.c b/lib/uuid.c index ec0f9d9..3fb88a3 100644 --- a/lib/uuid.c +++ b/lib/uuid.c @@ -38,18 +38,30 @@ static int s_getrandom(void *out, unsigned size, bool insecure) for (;;) { + ssize_t r; + int err; + #ifdef HAVE_SYS_RANDOM_H - ssize_t r = getrandom(out, size, flags); + r = getrandom(out, size, flags); +#elif defined(__NR_getrandom) + r = (ssize_t)syscall(__NR_getrandom, out, size, flags); #else - ssize_t r = (ssize_t)syscall(__NR_getrandom, out, size, flags); + r = -1; + errno = ENOSYS; + (void)flags; #endif - int err; if (r == size) break; err = errno; if (err != EINTR) { - if (err == EINVAL && kflags) { + if (__erofs_unlikely(err == ENOSYS && insecure)) { + while (size) { + *(u8 *)out++ = rand() % 256; + --size; + } + err = 0; + } else if (err == EINVAL && kflags) { // Kernel likely does not support GRND_INSECURE erofs_grnd_flag = 0; kflags = 0; -- 2.34.1