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:
parent
d6922db49d
commit
aa0c679f48
1 changed files with 1 additions and 1 deletions
|
@ -469,7 +469,7 @@ Optional second arg STATE is a random-state object."
|
||||||
(while (< (setq i (1+ i)) 200) (cl-random 2 state))))
|
(while (< (setq i (1+ i)) 200) (cl-random 2 state))))
|
||||||
(let* ((i (cl-callf (lambda (x) (% (1+ x) 55)) (cl--random-state-i 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)))
|
(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 (integerp lim)
|
||||||
(if (<= lim 512) (% n lim)
|
(if (<= lim 512) (% n lim)
|
||||||
(if (> lim 8388607) (setq n (+ (ash n 9) (cl-random 512 state))))
|
(if (> lim 8388607) (setq n (+ (ash n 9) (cl-random 512 state))))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue