changeset 107357:0f6a30c8d91a

Additional fix for rfc822-addresses (Bug#5692). * mail/rfc822.el (rfc822-addresses): Use nested catches to ensure that all errors are caught, and that the return value is always a list (Bug#5692).
author Chong Yidong <cyd@stupidchicken.com>
date Mon, 08 Mar 2010 11:17:30 -0500
parents 76b07c83bb0f
children ffae6d506d37
files lisp/ChangeLog lisp/mail/rfc822.el
diffstat 2 files changed, 36 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Mon Mar 08 14:00:18 2010 +0100
+++ b/lisp/ChangeLog	Mon Mar 08 11:17:30 2010 -0500
@@ -1,3 +1,9 @@
+2010-03-08  Chong Yidong  <cyd@stupidchicken.com>
+
+	* mail/rfc822.el (rfc822-addresses): Use nested catches to ensure
+	that all errors are caught, and that the return value is always a
+	list (Bug#5692).
+
 2010-03-08  Kenichi Handa  <handa@m17n.org>
 
 	* language/misc-lang.el (windows-1256): New coding system.
--- a/lisp/mail/rfc822.el	Mon Mar 08 14:00:18 2010 +0100
+++ b/lisp/mail/rfc822.el	Mon Mar 08 11:17:30 2010 -0500
@@ -290,32 +290,36 @@
               (replace-match "\\1 " t))
 
             (goto-char (point-min))
-            (let ((list ())
-                  tem
-                  ;; This is for rfc822-bad-address.  Give it a non-nil
-                  ;; initial value to prevent rfc822-bad-address from
-                  ;; raising a wrong-type-argument error
-                  (rfc822-address-start (point)))
-	      (rfc822-nuke-whitespace)
-	      (while (not (eobp))
-		(setq rfc822-address-start (point))
-		(setq tem
-		      (cond ((rfc822-looking-at ?\,)
-			     nil)
-			    ((looking-at "[][\000-\037@;:\\.>)]")
-			     (forward-char)
-			     (catch 'address ; this is for rfc822-bad-address
-			       (rfc822-bad-address
-				(format "Strange character \\%c found"
-					(preceding-char)))))
-			    (t
-			     (rfc822-addresses-1 t))))
-		(cond ((null tem))
-		      ((stringp tem)
-		       (setq list (cons tem list)))
-		      (t
-		       (setq list (nconc (nreverse tem) list)))))
-	      (nreverse list)))
+	    ;; Give `rfc822-address-start' a non-nil initial value to
+	    ;; prevent `rfc822-bad-address' from raising a
+	    ;; `wrong-type-argument' error.
+            (let* ((rfc822-address-start (point))
+		   list tem
+		   (err
+		    (catch 'address
+		      ;; Note that `rfc822-nuke-whitespace' and
+		      ;; `rfc822-looking-at' can throw.
+		      (rfc822-nuke-whitespace)
+		      (while (not (eobp))
+			(setq rfc822-address-start (point))
+			(setq tem
+			      (cond ((rfc822-looking-at ?\,)
+				     nil)
+				    ((looking-at "[][\000-\037@;:\\.>)]")
+				     (forward-char)
+				     (catch 'address ; For rfc822-bad-address
+				       (rfc822-bad-address
+					(format "Strange character \\%c found"
+						(preceding-char)))))
+				    (t
+				     (rfc822-addresses-1 t))))
+			(cond ((null tem))
+			      ((stringp tem)
+			       (setq list (cons tem list)))
+			      (t
+			       (setq list (nconc (nreverse tem) list)))))
+		      nil)))
+	      (nreverse (append (if err (list err)) list))))
 	(and buf (kill-buffer buf))))))
 
 (provide 'rfc822)