]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
stdlib: Fix unintended change to the random_r implementation
authorFlorian Weimer <fweimer@redhat.com>
Mon, 20 Jan 2025 20:06:43 +0000 (21:06 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Mon, 20 Jan 2025 20:31:55 +0000 (21:31 +0100)
Commit d5bceac99d24af1131b90027dab267e437b65cd1 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 d5bceac99d24af1131b90027dab267e437b65cd1 ("stdlib:
random_r: fix unaligned access in initstate and initstate_r
[BZ #30584]").

Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
stdlib/random_r.c

index 605e96983c266ba8c505114cfa319a7c8318adda..b49f03f5becd5063b445c1ebdf683730bf3dea07 100644 (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;