diff options
| author | Leah Rowe <leah@libreboot.org> | 2026-03-25 19:26:48 +0000 |
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2026-03-26 06:59:42 +0000 |
| commit | a6f76ac4ee922717ee597d7687b3b17c8082d644 (patch) | |
| tree | ed8532f774891217f0e21dec50a903ac1e41c1d5 /util/libreboot-utils | |
| parent | cbe48caf1b45192a3d1f4eddefc6f0c8f2a5bb94 (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/libreboot-utils')
| -rw-r--r-- | util/libreboot-utils/lib/mkhtemp.c | 29 |
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. |
