]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
random: improve on platforms without arc4random
authorBaptiste Daroussin <bapt@FreeBSD.org>
Thu, 26 Mar 2026 21:30:27 +0000 (22:30 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Thu, 26 Mar 2026 21:30:27 +0000 (22:30 +0100)
src/random-int.c

index 7de924ed0666f44ada6b6bd70a00c6508d6346b6..db5e811968dec2cf2e724fbd1b2a64f84e9e971e 100644 (file)
 int random_int(void)
 {
 #ifndef HAVE_ARC4RANDOM_UNIFORM
-       static int init = 0;
-       unsigned int seed;
        int devrandom;
-       uint32_t ch;
-
-       if (init) return rand();
-
-       seed = (unsigned int)time(NULL);
+       uint32_t val;
 
        devrandom = open("/dev/urandom", O_RDONLY);
-       if(devrandom < 0)
+       if (devrandom < 0)
                devrandom = open("/dev/random", O_RDONLY);
 
        if (devrandom >= 0) {
-               readn(devrandom, &ch, 1);
-               seed ^= ch;
-               readn(devrandom, &ch, 1);
-               seed ^= ch << 8;
-               readn(devrandom, &ch, 1);
-               seed ^= ch << 16;
-               readn(devrandom, &ch, 1);
-               seed ^= ch << 24;
+               readn(devrandom, &val, sizeof(val));
                close(devrandom);
+               return (int)(val & 0x7fffffff);
        }
 
-       srand(seed);
-       init = 1;
-
+       /* Last resort fallback if no random device available */
+       srand((unsigned int)time(NULL) ^ (unsigned int)getpid());
        return rand();
 #else
        return arc4random_uniform(INT_MAX);