summaryrefslogtreecommitdiffstats
path: root/Src/Modules/random.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Modules/random.c')
-rw-r--r--Src/Modules/random.c43
1 files changed, 23 insertions, 20 deletions
diff --git a/Src/Modules/random.c b/Src/Modules/random.c
index 88ac9543c..8aca7e9d4 100644
--- a/Src/Modules/random.c
+++ b/Src/Modules/random.c
@@ -82,12 +82,15 @@ getrandom_buffer(void *buf, size_t len)
zwarn("Unable to get random data: %e.", errno);
return -1;
}
+ continue;
}
-#ifndef HAVE_ARC4RANDOM_BUF
+#ifdef HAVE_ARC4RANDOM_BUF
+ } while (0);
+#else
bufptr += ret;
val += ret;
+ } while (val < len);
#endif
- } while (ret < len);
return ret;
}
@@ -110,17 +113,11 @@ get_bound_random_buffer(uint32_t *buffer, size_t count, uint32_t max)
size_t i; /* loop counter */
getrandom_buffer((void*) buffer, count*sizeof(uint32_t));
- if (max == UINT32_MAX)
- return;
for(i=0;i<count;i++) {
multi_result = ((uint64_t) buffer[i]) * (uint64_t) max;
leftover = (uint32_t) multi_result;
- /*
- * The following if statement should (according to Google's Gemini)
- * only be executed with a probability of 1/2**32 or 2.33e-10
- */
if(leftover < max) {
threshold= -max % max;
while (leftover < threshold) {
@@ -162,30 +159,37 @@ math_zrand_int(UNUSED(char *name), int argc, mnumber *argv, UNUSED(int id))
{
mnumber ret;
uint32_t i;
- zlong lower=0, upper=UINT32_MAX,incl=0, diff;
+ zlong lower = 0,
+ upper = UINT32_MAX,
+ incl = 0,
+ diff = UINT32_MAX;
ret.type = MN_INTEGER;
switch (argc) {
- case 0: ret.u.l=get_srandom(NULL);
- return ret;
- break;
+ case 0: incl = 1; break;
case 3: incl = (argv[2].u.l != 0)?1:0;
case 2: lower = argv[1].u.l;
case 1: upper = argv[0].u.l;
default: diff = upper-lower+incl;
}
- if (lower < 0 || lower >= UINT32_MAX) {
- zwarn("Lower bound (%z) out of range: 0-4294967295",lower);
+ if (lower < 0 || lower > UINT32_MAX) {
+ zwarn("lower bound (%z) out of range: 0-4294967295",lower);
+ ret.u.l = 0; return ret;
} else if (upper < lower) {
- zwarn("Upper bound (%z) must be greater than Lower Bound (%z)",upper,lower);
- } else if (upper < 0 || upper >= UINT32_MAX) {
- zwarn("Upper bound (%z) out of range: 0-4294967295",upper);
+ zwarn("upper bound (%z) must be greater than lower bound (%z)",upper,lower);
+ ret.u.l = 0; return ret;
+ } else if (upper < 0 || upper > UINT32_MAX) {
+ zwarn("upper bound (%z) out of range: 0-4294967295", upper);
+ ret.u.l = 0; return ret;
}
- if ( diff == 0 ) {
+ if (diff == 0) {
ret.u.l=upper; /* still not convinced this shouldn't be an error. */
+ } else if (upper == UINT32_MAX && lower == 0 && incl == 1) {
+ ret.u.l = get_srandom(NULL);
+ return ret;
} else {
get_bound_random_buffer(&i,1,(uint32_t) diff);
ret.u.l=i+lower;
@@ -253,9 +257,8 @@ setup_(UNUSED(Module m))
return 1;
}
- errno=0;
if (!(S_ISCHR(st.st_mode)) ) {
- zwarn("Error getting kernel random pool: %e.", errno);
+ zwarn("Error getting kernel random pool: /dev/urandom is not a character device");
return 1;
}
#endif /* USE_URANDOM */