stdlib: Fix unintended change to the random_r implementation

Commit d5bceac99d changed the sequence
of random numbers.  This was completely unintended.  The statistical
properties of the new sequences are unclear, so restore the old
behavior.

Fixes commit d5bceac99d ("stdlib:
random_r: fix unaligned access in initstate and initstate_r
[BZ #30584]").

Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
This commit is contained in:
Florian Weimer 2025-01-20 21:06:43 +01:00
parent a3131e71cf
commit 33b684e019

View file

@ -390,9 +390,10 @@ __random_r (struct random_data *buf, int32_t *result)
int32_t *end_ptr = buf->end_ptr;
uint32_t val;
val = read_state (rptr, 0);
int32_t t = read_state (fptr, 0);
write_state (fptr, 0, t + val);
/* Avoid integer overflow with uint32_t arihmetic. */
val = read_state (fptr, 0);
val += read_state (rptr, 0);
write_state (fptr, 0, val);
/* Chucking least random bit. */
*result = val >> 1;
++fptr;