summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-03-25 19:26:48 +0000
committerLeah Rowe <leah@libreboot.org>2026-03-26 06:59:42 +0000
commita6f76ac4ee922717ee597d7687b3b17c8082d644 (patch)
treeed8532f774891217f0e21dec50a903ac1e41c1d5 /util
parentcbe48caf1b45192a3d1f4eddefc6f0c8f2a5bb94 (diff)
libreboot-utils: tidy up rand
make it more efficient. much lower rejection rate now, about 2-5%. deal with bias, but also get numbers in bulk. not too many. i'd say this is about right in terms of performance balance. 64 bytes == 8 large integers. Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'util')
-rw-r--r--util/libreboot-utils/lib/mkhtemp.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/util/libreboot-utils/lib/mkhtemp.c b/util/libreboot-utils/lib/mkhtemp.c
index 0c93fe7e..a669e208 100644
--- a/util/libreboot-utils/lib/mkhtemp.c
+++ b/util/libreboot-utils/lib/mkhtemp.c
@@ -879,33 +879,32 @@ err:
int
mkhtemp_fill_random(char *p, size_t xc)
{
- static char ch[] =
+ static const char ch[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- size_t chx = 0;
- size_t r;
+ unsigned char scratch[64];
- /* clamp rand to prevent modulo bias
- */
- size_t limit = ((size_t)-1) - (((size_t)-1) % (sizeof(ch) - 1));
- int saved_errno = errno;
+ size_t off = 0;
+ size_t i;
+
+ /* clamp rand to prevent modulo bias */
+ size_t limit = 256 - (256 % (sizeof(ch) - 1));
if (if_err(p == NULL, EFAULT))
return -1;
- for (chx = 0; chx < xc; chx++) {
-
retry_rand:
- rset(&r, sizeof(r));
- if (r >= limit)
- goto retry_rand;
+ rset(scratch, sizeof(scratch));
- p[chx] = ch[r % (sizeof(ch) - 1)];
+ for (i = 0; i < sizeof(scratch) && off < xc; i++) {
+ if (scratch[i] < limit)
+ p[off++] = ch[scratch[i] % (sizeof(ch) - 1)];
}
- errno = saved_errno;
- return 0;
+ if (off < xc)
+ goto retry_rand;
+ return 0;
}
/* WARNING: **ONCE** per file.