GNU bug report logs - #453
23.0.60; rfc822-bad-address: wrong-type-argument error

Previous Next

Package: emacs;

Reported by: Stephen Berman <stephen.berman <at> gmx.net>

Date: Fri, 20 Jun 2008 15:40:04 UTC

Severity: normal

Done: Chong Yidong <cyd <at> stupidchicken.com>

Bug is archived. No further changes may be made.

Full log


Message #25 received at 453 <at> emacsbugs.donarmstrong.com (full text, mbox):

From: Stephen Berman <stephen.berman <at> gmx.net>
To: Chong Yidong <cyd <at> stupidchicken.com>
Cc: 453 <at> debbugs.gnu.org
Subject: Re: bug#453: 23.0.60; rfc822-bad-address: wrong-type-argument error
Date: Tue, 02 Sep 2008 18:07:57 +0200
On Wed, 27 Aug 2008 10:38:24 -0400 Chong Yidong <cyd <at> stupidchicken.com> wrote:

> Stephen Berman <stephen.berman <at> gmx.net> writes:
>
>> 1. bbdb-rfc822-addresses is trying to parse this header:
>>    (""Groß, Werner"") <W.F.Gross <at> t-online.de>
>>    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)))




This bug report was last modified 16 years and 244 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.