Subject: bug#453: 23.0.60; rfc822-bad-address: wrong-type-argument error

From: Stephen Berman <[email-masked]>
Date: Tue, 02 Sep 2008 18:07:57 +0200

On Wed, 27 Aug 2008 10:38:24 -0400 Chong Yidong <[email-masked]> wrote:

> Stephen Berman <[email-masked]> writes:
>
>> 1. bbdb-rfc822-addresses is trying to parse this header:
>>    (""Groß, Werner"") <[email-masked]>
>>    which presumably violates RFC822.
>> 2. bbdb-rfc822-addresses calls rfc822-addresses, which turns the header
>>    into this string:
>>    (""Groß
>>    and, after let-binding but before setq-ing rfc822-address-start,
>> 3. calls rfc822-nuke-whitespace, which further truncates the header to:
>>    (
>>    and then calls
>> 4. rfc822-bad-address, which tries to call narrow-to-region with
>>    rfc822-address-start, which is still nil, as the beginning of the
>>    region: BZZT!
>
> Now I understand.  could you send a new patch?  Thanks.

I was going to just resend my patch minus the inappropriate white space
changes.  But upon reconsideration, I'm not confident that the patch I
sent previously DTRT.  I'm not even sure what TRT is here: as I wrote in
my OP, my patch returns an error string as specified by
rfc822-bad-address, but the caller bbdb-rfc822-addresses expects a list,
so it still raises a wrong-type error.  This happens when the relocated
catch sexp has scope to the end of the let that immediately encloses it
(patch (i) below).  But I leave the catch in its existing position and
move rfc822-nuke-whitespace to within it (patch (ii) below), then no
error is raised, but also there's no indication of a bad address; yet
stepping through the code with edebug does pass through
rfc822-bad-address.  So where should the catch be located?  Hopefully
someone familiar (unlike me) with RFC 822 and rfc822.el, and ideally
also bbdb-rfc822-addresses, can answer that question and say whether
either of these patches is suitable, or provide a better one.

Steve Berman

Patch (i) (returns an error string as specified by rfc822-bad-address,
but raises a wrong-type error with bbdb-rfc822-addresses):

*** emacs/lisp/mail/rfc822.el.~1.28.~	2008-05-06 17:54:09.000000000 +0200
--- emacs/lisp/mail/rfc822.el	2008-09-02 17:35:28.000000000 +0200
***************
*** 292,303 ****
  	  (goto-char (point-min))
  	  (let ((list ())
  		tem
! 		rfc822-address-start); this is for rfc822-bad-address
! 	    (rfc822-nuke-whitespace)
! 	    (while (not (eobp))
! 	      (setq rfc822-address-start (point))
! 	      (setq tem
! 		    (catch 'address ; this is for rfc822-bad-address
  		      (cond ((rfc822-looking-at ?\,)
  			     nil)
  			    ((looking-at "[][\000-\037@;:\\.>)]")
--- 292,306 ----
  	  (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)))
! 	    (catch 'address ; this is for rfc822-bad-address
! 	      (rfc822-nuke-whitespace)
! 	      (while (not (eobp))
! 		(setq rfc822-address-start (point))
! 		(setq tem
  		      (cond ((rfc822-looking-at ?\,)
  			     nil)
  			    ((looking-at "[][\000-\037@;:\\.>)]")
***************
*** 306,318 ****
  			       (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)))
        (and buf (kill-buffer buf))))))
  
  (provide 'rfc822)
--- 309,321 ----
  			       (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))))
        (and buf (kill-buffer buf))))))
  
  (provide 'rfc822)

Patch (ii) (bbdb-rfc822-addresses raises no error, but also there's no
indication of a bad address; yet stepping through the code with edebug
does pass through rfc822-bad-address):

*** emacs/lisp/mail/rfc822.el.~1.28.~	2008-05-06 17:54:09.000000000 +0200
--- emacs/lisp/mail/rfc822.el	2008-09-02 18:01:49.000000000 +0200
***************
*** 293,312 ****
  	  (let ((list ())
  		tem
  		rfc822-address-start); this is for rfc822-bad-address
- 	    (rfc822-nuke-whitespace)
  	    (while (not (eobp))
  	      (setq rfc822-address-start (point))
  	      (setq tem
  		    (catch 'address ; this is for rfc822-bad-address
! 		      (cond ((rfc822-looking-at ?\,)
! 			     nil)
! 			    ((looking-at "[][\000-\037@;:\\.>)]")
! 			     (forward-char)
! 			     (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)))
--- 293,313 ----
  	  (let ((list ())
  		tem
  		rfc822-address-start); this is for rfc822-bad-address
  	    (while (not (eobp))
  	      (setq rfc822-address-start (point))
  	      (setq tem
  		    (catch 'address ; this is for rfc822-bad-address
! 		      (progn
! 			(rfc822-nuke-whitespace)
! 			(cond ((rfc822-looking-at ?\,)
! 			       nil)
! 			      ((looking-at "[][\000-\037@;:\\.>)]")
! 			       (forward-char)
! 			       (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)))