]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix the mm-decode-content-transfer-encoding overflow better
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 1 May 2022 08:20:07 +0000 (10:20 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 1 May 2022 08:20:07 +0000 (10:20 +0200)
* lisp/gnus/mm-bodies.el (mm-decode-content-transfer-encoding):
Use it.
(mm-base64-line-p): New function.

lisp/gnus/mm-bodies.el

index 9f2f80b4726be65eee976b323fcc1ce83041d6b8..0d4237a64c99d9df4d2cd8ab20c361d619ea5477 100644 (file)
@@ -201,8 +201,11 @@ If TYPE is `text/plain' CRLF->LF translation may occur."
               ;; mailing list software by finding the final line with
               ;; base64 text.
               (goto-char (point-max))
-              (when (re-search-backward "[A-Za-z0-9+/]{3,3}=?[\t ]*$" nil t)
-                (forward-line))
+               (beginning-of-line)
+               (while (and (not (mm-base64-line-p))
+                           (not (bobp)))
+                 (forward-line -1))
+               (forward-line 1)
               (point))))
           ((memq encoding '(nil 7bit 8bit binary))
            ;; Do nothing.
@@ -235,6 +238,18 @@ If TYPE is `text/plain' CRLF->LF translation may occur."
       (while (search-forward "\r\n" nil t)
        (replace-match "\n" t t)))))
 
+(defun mm-base64-line-p ()
+  "Say whether the current line is base64."
+  ;; This is coded in this way to avoid using regexps that may
+  ;; overflow -- a base64 line may be megabytes long.
+  (save-excursion
+    (beginning-of-line)
+    (skip-chars-forward " \t")
+    (skip-chars-forward "A-Za-z0-9+")
+    (skip-chars-forward "=")
+    (skip-chars-forward " \t")
+    (eolp)))
+
 (defun mm-decode-body (charset &optional encoding type)
   "Decode the current article that has been encoded with ENCODING to CHARSET.
 ENCODING is a MIME content transfer encoding.