emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master b9c0ea6: Port message-checksum to bignums


From: Paul Eggert
Subject: [Emacs-diffs] master b9c0ea6: Port message-checksum to bignums
Date: Wed, 26 Dec 2018 04:12:37 -0500 (EST)

branch: master
commit b9c0ea6a6bc01c0034d00d685cab0de5953fdcc9
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    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 03f8061..dc15769 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -5400,6 +5400,17 @@ Otherwise, generate and save a value for 
`canlock-password' first."
             (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 @@ Otherwise, generate and save a value for 
`canlock-password' first."
        (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))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]