]> git.eshelyaron.com Git - emacs.git/commitdiff
Add work-around for nnmaildir encoding problem
authorLars Ingebrigtsen <larsi@gnus.org>
Thu, 7 Jan 2021 14:12:23 +0000 (15:12 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 7 Jan 2021 14:12:23 +0000 (15:12 +0100)
* lisp/gnus/mm-decode.el (mm-with-part): Fix problem with
multipart 8bit encoded posts from nnmaildir (bug#44307).

lisp/gnus/mm-decode.el
test/lisp/gnus/mm-decode-tests.el

index 61946aa58115d86d2b09bb578d7398b942cec630..2b0b61bfac67ccad7c57699c889e6e9821f468b1 100644 (file)
@@ -1264,11 +1264,20 @@ in HANDLE."
      (when (and (mm-handle-buffer handle)
                (buffer-name (mm-handle-buffer handle)))
        (with-temp-buffer
-        (mm-disable-multibyte)
-        (insert-buffer-substring (mm-handle-buffer handle))
-        (mm-decode-content-transfer-encoding
-         (mm-handle-encoding handle)
-         (mm-handle-media-type handle))
+        (if (and (eq (mm-handle-encoding handle) '8bit)
+                 (with-current-buffer (mm-handle-buffer handle)
+                   enable-multibyte-characters))
+            ;; Due to unfortunate historical reasons, we may have a
+            ;; multibyte buffer here, but if it's using an 8bit
+            ;; Content-Transfer-Encoding, then work around that by
+            ;; just ignoring the situation.
+            (insert-buffer-substring (mm-handle-buffer handle))
+          ;; Do the decoding.
+          (mm-disable-multibyte)
+          (insert-buffer-substring (mm-handle-buffer handle))
+          (mm-decode-content-transfer-encoding
+           (mm-handle-encoding handle)
+           (mm-handle-media-type handle)))
         ,@forms))))
 (put 'mm-with-part 'lisp-indent-function 1)
 (put 'mm-with-part 'edebug-form-spec '(body))
index 976e7269b141127b4f2dacc832370b23c7745441..74591f919da78bc1dd94f197239361e60acbc7db 100644 (file)
@@ -54,7 +54,7 @@
                                                          'charset)))
                          "<!doctype html><html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"></head><body>ääää</body></html>\n")))))))
 
-(ert-deftest test-mm-with-part ()
+(ert-deftest test-mm-with-part-unibyte ()
   (with-temp-buffer
     (set-buffer-multibyte nil)
     (insert-file-contents-literally (ert-resource-file "8bit-multipart.bin"))
                                                        'charset)))
                        "ääää\n"))))))
 
+(ert-deftest test-mm-with-part-multibyte ()
+  (with-temp-buffer
+    (set-buffer-multibyte t)
+    (nnheader-insert-file-contents (ert-resource-file "8bit-multipart.bin"))
+    (while (search-forward "\r\n" nil t)
+      (replace-match "\n"))
+    (let ((handle (mm-dissect-buffer)))
+      (pop handle)
+      (let ((part (pop handle)))
+        (should (equal (decode-coding-string
+                        (mm-with-part part
+                          (buffer-string))
+                        (intern (mail-content-type-get (mm-handle-type part)
+                                                       'charset)))
+                       "ääää\n"))))))
+
 ;;; mm-decode-tests.el ends here