emacs-diffs
[Top][All Lists]
Advanced

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

master ed9520b: * lisp/mail/rfc2231.el (rfc2231-decode-encoded-string):


From: Stefan Monnier
Subject: master ed9520b: * lisp/mail/rfc2231.el (rfc2231-decode-encoded-string): Fix match data error
Date: Mon, 19 Oct 2020 13:03:46 -0400 (EDT)

branch: master
commit ed9520b38e1fb8dc45a9eb4227ceb49387843de2
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    * lisp/mail/rfc2231.el (rfc2231-decode-encoded-string): Fix match data error
    
    Get (match-string 3 string) earlier, in case `mm-charset-to-coding-system`
    clobbers the match data.
    Also, check that `string-match` succeeded before using its match data.
---
 lisp/mail/rfc2231.el | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/lisp/mail/rfc2231.el b/lisp/mail/rfc2231.el
index add0997..17da60e 100644
--- a/lisp/mail/rfc2231.el
+++ b/lisp/mail/rfc2231.el
@@ -215,23 +215,25 @@ These look like:
  \"\\='en-us\\='This%20is%20%2A%2A%2Afun%2A%2A%2A\",
  \"\\='\\='This%20is%20%2A%2A%2Afun%2A%2A%2A\", or
  \"This is ***fun***\"."
-  (string-match "\\`\\(?:\\([^']+\\)?'\\([^']+\\)?'\\)?\\(.+\\)" string)
-  (let ((coding-system (mm-charset-to-coding-system
-                       (match-string 1 string) nil t))
-       ;;(language (match-string 2 string))
-       (value (match-string 3 string)))
-    (mm-with-unibyte-buffer
-      (insert value)
-      (goto-char (point-min))
-      (while (re-search-forward "%\\([[:xdigit:]][[:xdigit:]]\\)" nil t)
-       (insert
-        (prog1
-            (string-to-number (match-string 1) 16)
-          (delete-region (match-beginning 0) (match-end 0)))))
-      ;; Decode using the charset, if any.
-      (if (memq coding-system '(nil ascii))
-         (buffer-string)
-       (decode-coding-string (buffer-string) coding-system)))))
+  (if (not (string-match "\\`\\(?:\\([^']+\\)?'\\([^']+\\)?'\\)?\\(.+\\)\\'"
+                         string))
+      (error "Unrecognized RFC2231 format: %S" string)
+    (let ((value (match-string 3 string))
+         ;;(language (match-string 2 string))
+         (coding-system (mm-charset-to-coding-system
+                         (match-string 1 string) nil t)))
+      (mm-with-unibyte-buffer
+        (insert value)
+        (goto-char (point-min))
+        (while (re-search-forward "%\\([[:xdigit:]][[:xdigit:]]\\)" nil t)
+         (insert
+          (prog1
+              (string-to-number (match-string 1) 16)
+            (delete-region (match-beginning 0) (match-end 0)))))
+       ;; Decode using the charset, if any.
+       (if (memq coding-system '(nil ascii))
+           (buffer-string)
+         (decode-coding-string (buffer-string) coding-system))))))
 
 (defun rfc2231-encode-string (param value)
   "Return a PARAM=VALUE string encoded according to RFC2231.



reply via email to

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