erofs-utils: lib: uuid: fix compilation error if __NR_getrandom doesn't exist
authorGao Xiang <hsiangkao@linux.alibaba.com>
Mon, 29 Jul 2024 11:25:24 +0000 (19:25 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 30 Jul 2024 01:57:38 +0000 (09:57 +0800)
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 <dhavale@google.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240729112524.930460-1-hsiangkao@linux.alibaba.com
lib/uuid.c

index ec0f9d9596028c22b35c0b9d3f86ef43c1250b1f..3fb88a3ca1bb73c687de45731bb871f2cb5c0d07 100644 (file)
@@ -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;