From: Gao Xiang Date: Mon, 29 Jul 2024 11:25:24 +0000 (+0800) Subject: erofs-utils: lib: uuid: fix compilation error if __NR_getrandom doesn't exist X-Git-Tag: v1.8~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ac0997ea32a465a6b0db7b782bb8d4d07952365a;p=platform%2Fupstream%2Ferofs-utils.git erofs-utils: lib: uuid: fix compilation error if __NR_getrandom doesn't exist 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 --- 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;