1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-07 15:21:46 +00:00

Avoid unbounded growth of cl-random-state components (bug#38753)

* 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.
This commit is contained in:
Mattias Engdegård 2019-12-29 13:51:48 +01:00
parent d6922db49d
commit aa0c679f48

View 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))))