>From b9c0ea6a6bc01c0034d00d685cab0de5953fdcc9 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 26 Dec 2018 01:11:58 -0800 Subject: [PATCH] Port message-checksum to bignums * lisp/gnus/message.el (message--rotate-fixnum-left): New function. (message-checksum): Use it instead of assuming fixnum-only arithmetic. This should fix Bug#33083. --- lisp/gnus/message.el | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 03f80616d9..dc15769a4f 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -5400,6 +5400,17 @@ message-check-news-body-syntax (message "Denied posting -- only quoted text.") nil))))))) +(defun message--rotate-fixnum-left (n) + "Rotate the fixnum N left by one bit in a fixnum word. +The result is a fixnum." + (logior (if (natnump n) 0 1) + (ash (cond ((< (ash most-positive-fixnum -1) n) + (logior n most-negative-fixnum)) + ((< n (ash most-negative-fixnum -1)) + (logand n most-positive-fixnum)) + (n)) + 1))) + (defun message-checksum () "Return a \"checksum\" for the current buffer." (let ((sum 0)) @@ -5409,7 +5420,7 @@ message-checksum (concat "^" (regexp-quote mail-header-separator) "$")) (while (not (eobp)) (when (not (looking-at "[ \t\n]")) - (setq sum (logxor (ash sum 1) (if (natnump sum) 0 1) + (setq sum (logxor (message--rotate-fixnum-left sum) (char-after)))) (forward-char 1))) sum)) -- 2.17.1