]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid unbounded growth of cl-random-state components (bug#38753)
authorMattias Engdegård <mattiase@acm.org>
Sun, 29 Dec 2019 12:51:48 +0000 (13:51 +0100)
committerMattias Engdegård <mattiase@acm.org>
Sun, 29 Dec 2019 12:55:25 +0000 (13:55 +0100)
* lisp/emacs-lisp/cl-extra.el (cl-random):
Perform the modulo 2**23 operation before updating the state instead
of after.  The result is always the same, but it prevents the state
from growing into arbitrary large bignums.

Patch from Christopher Wellons.

lisp/emacs-lisp/cl-extra.el

index 7e9d8fe870bf9d52185f4b78f5024a1c78ffbab1..2e0b37c14deebb94115ce5c4ad4d8c83992e929c 100644 (file)
@@ -469,7 +469,7 @@ Optional second arg STATE is a random-state object."
          (while (< (setq i (1+ i)) 200) (cl-random 2 state))))
     (let* ((i (cl-callf (lambda (x) (% (1+ x) 55)) (cl--random-state-i state)))
           (j (cl-callf (lambda (x) (% (1+ x) 55)) (cl--random-state-j state)))
-          (n (logand 8388607 (aset vec i (- (aref vec i) (aref vec j))))))
+          (n (aset vec i (logand 8388607 (- (aref vec i) (aref vec j))))))
       (if (integerp lim)
          (if (<= lim 512) (% n lim)
            (if (> lim 8388607) (setq n (+ (ash n 9) (cl-random 512 state))))