Subject: bug#28671: closed (Re: bug#28671: 25.2; double transfer-encoding in rmailedit for complex mime messages)

From: [email-masked] (GNU bug Tracking System)
Date: Mon, 09 Oct 2017 13:57:03 +0000

Your bug report

#28671: 25.2; double transfer-encoding in rmailedit for complex mime messages

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
28671: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=28671
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#28671: 25.2; double transfer-encoding in rmailedit for complex mime messages
From: Eli Zaretskii <[email-masked]>
To: Ken Olum <[email-masked]>
Cc: [email-masked]
Date: Mon, 09 Oct 2017 16:55:55 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

> From: Ken Olum <[email-masked]>
> Cc: [email-masked], [email-masked]
> Date: Mon, 02 Oct 2017 13:47:20 -0400
> 
> Here is a test file.  Edit the first message and make some change (e.g.,
> to the subject header).  Then the body will end up base64 encoded
> twice.  If you then go to the next message, the headers will have extra
> lines at the top due to marker problems.  The patch should fix these
> problems.
> 
> Here's a new patch with the simplified code as you suggested, and
> here's a change log entry:

Thanks, pushed to the release branch.

Subject: 25.2; double transfer-encoding in rmailedit for complex mime messages
From: Ken Olum <[email-masked]>
To: [email-masked]
Cc: [email-masked]
Date: Mon, 02 Oct 2017 11:37:46 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

When rmail-edit-current-message gets a mime message which is too complex
for it to handle (i.e., anything but one "text/plain" part), it just
gives you the raw message to edit.  If you do so, rmail-cease-edit then
applies the transfer-encoding even though the message wasn't decoded,
and so on.  It also in some circumstances it also moves the marker for
the beginning of the following message.

The attached patch modifies rmail-cease-edit to check the
rmail-old-mime-state flag set by rmail-edit-current-message when it is
editing the raw message.  If set, rmail-cease-edit inserts the
already-encoded body without further processing.  It also deletes the
old body after inserting the new, rather than before, to avoid moving
the next message's marker.

                                        Ken

In GNU Emacs 25.2.2 (x86_64-unknown-linux-gnu, X toolkit, Xaw scroll bars)
 of 2017-05-29 built on olum.org
Windowing system distributor 'The X.Org Foundation', version 11.0.11804000
System Description:	Ubuntu 16.04.3 LTS

Configured features:
XPM JPEG TIFF GIF PNG SOUND NOTIFY FREETYPE XFT ZLIB TOOLKIT_SCROLL_BARS
LUCID X11

--- lisp/mail/rmailedit.el	2017-07-06 10:27:25.654906559 -0400
+++ lisp/mail/rmailedit.new.el	2017-09-26 12:00:45.498641338 -0400
@@ -312,26 +312,34 @@
             (data-buffer (current-buffer))
             (start (copy-marker (point) nil)) ; new body will be between
             (end (copy-marker (point) t)))    ; these two markers
-        (with-current-buffer rmail-view-buffer
-          (encode-coding-region headers-end (point-max) coding-system
-                                data-buffer))
-        (delete-region end (point-max))
+        (if mime-state
+            ;; Message is already in encoded state
+            (insert-buffer-substring rmail-view-buffer headers-end
+                                     (with-current-buffer rmail-view-buffer
+                                       (point-max)))
+          (with-current-buffer rmail-view-buffer
+            (encode-coding-region headers-end (point-max) coding-system
+                                  data-buffer)))
 	;; Apply to the mbox buffer any changes in header fields
 	;; that the user made while editing in the view buffer.
 	(rmail-edit-update-headers (rmail-edit-diff-headers
 				    rmail-old-headers new-headers))
 	;; Re-apply content-transfer-encoding, if any, on the message body.
-	(cond
-	 ((string= character-coding "quoted-printable")
-	  (mail-quote-printable-region start (point-max)))
-	 ((and (string= character-coding "base64") is-text-message)
-	  (base64-encode-region start (point-max)))
-	 ((and (eq character-coding 'uuencode) is-text-message)
-	  (error "uuencoded messages are not supported")))
+        (unless mime-state              ; if set, already transfer-encoded
+          (cond
+           ((string= character-coding "quoted-printable")
+            (mail-quote-printable-region start end))
+           ((and (string= character-coding "base64") is-text-message)
+            (base64-encode-region start end))
+           ((and (eq character-coding 'uuencode) is-text-message)
+            (error "uuencoded messages are not supported"))))
         ;; After encoding, make sure buffer ends with a blank line so as not to
         ;; run this message together with the following one.
-        (goto-char (point-max))
-        (rmail-ensure-blank-line))
+        (goto-char end)
+        (rmail-ensure-blank-line)
+        ;; Delete previous body.  This must be after all insertions at the end,
+        ;; so the marker for the beginning of the next message isn't messed up.
+        (delete-region end (point-max)))
       (rmail-set-attribute rmail-edited-attr-index t))
 ;;;??? BROKEN perhaps.
 ;;;    (if (boundp 'rmail-summary-vector)