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

From: Stephen Berman <[email-masked]>
Date: Fri, 20 Jun 2008 17:34:40 +0200

I was reading a newsgroup with Gnus, typed `n'
(gnus-summary-next-unread-article) to read the next article[1], and got
a wrong-type-argument error.  The backtrace is attached.  The error
occurs in rfc822-bad-address, when the first argument of
narrow-to-region, rfc822-address-start, is nil.  The value is nil at
this point because rfc822-addresses calls rfc822-nuke-whitespace before
rfc822-address-start is assigned an initial value.  Simply assigning an
initial non-nil in the let declaration does not work, because then
rfc822-bad-address tries to throw to 'address, but the corresponding
catch in rfc822-addresses has not yet been established -- that happens
after the call to rfc822-nuke-whitespace.  I tried moving the catch
above the rfc822-nuke-whitespace call: in combination with an initial
value for rfc822-address-start, this allows rfc822-bad-address to return
an error string to rfc822-addresses -- see the patch below --, but the
caller in my setup, bbdb-rfc822-addresses, expects a list, so this
raises another wrong-type-argument error.  If it is legitimate for
rfc822-bad-address to return a non-list value in this case, then the bug
is presumably in bbdb-rfc822-addresses (from bbdb-snarf.el, not part of
Emacs); but I don't know if this is the right diagnosis.  If it is, I'll
report it to the BBDB list, and the patch below, or a better one, should
be applied to rfc822.el.

Steve Berman

Debugger entered--Lisp error: (wrong-type-argument integer-or-marker-p nil)
  narrow-to-region(nil 5)
  (save-restriction (insert "_^_") (narrow-to-region rfc822-address-start (if ... ... ...)) (let (...) (while losers ... ... ...)) (goto-char (point-min)) (insert "(Unparsable address -- " reason ": \"") (goto-char (point-max)) (insert "\")"))
  rfc822-bad-address("Unbalanced comment (...)")
  (if (eobp) (rfc822-bad-address "Unbalanced comment (...)") (/= (setq ch ...) 41))
  (while (if (eobp) (rfc822-bad-address "Unbalanced comment (...)") (/= ... 41)) (cond (... ...) (... ...) (... ...) (t ...)))
  (cond ((eobp) nil) ((= ... 40) (forward-char 1) (while ... ...) (forward-char -1) (delete-char 2) t) ((memq ch ...) (delete-region ... ...) t) (t nil))
  (while (cond (... nil) (... ... ... ... ... t) (... ... t) (t nil)))
  (let (ch) (while (cond ... ... ... ...)) (or (not leave-space) (eobp) (bobp) (= ... 32) (insert 32)))
  rfc822-nuke-whitespace()
  (let ((list nil) tem rfc822-address-start) (rfc822-nuke-whitespace) (while (not ...) (setq rfc822-address-start ...) (setq tem ...) (cond ... ... ...)) (nreverse list))
  (save-excursion (set-buffer buf) (make-local-variable (quote case-fold-search)) (setq case-fold-search nil) (insert header-text) (goto-char (point-min)) (while (re-search-forward "\\([^\\]\\(\\\\\\\\\\)*\\)\n[ 	]" nil t) (replace-match "\\1 " t)) (goto-char (point-min)) (let (... tem rfc822-address-start) (rfc822-nuke-whitespace) (while ... ... ... ...) (nreverse list)))
  (unwind-protect (save-excursion (set-buffer buf) (make-local-variable ...) (setq case-fold-search nil) (insert header-text) (goto-char ...) (while ... ...) (goto-char ...) (let ... ... ... ...)) (and buf (kill-buffer buf)))
  (let ((buf ...)) (unwind-protect (save-excursion ... ... ... ... ... ... ... ...) (and buf ...)))
  (if (string-match "\\`[ 	]*\\([^][
  rfc822-addresses("(\"\"Gro\x00df")
  (let* ((thisaddr ...) (comma ...) (parsed ...)) (if (string-match "(" ...) (setq start comma) (setq addrs ... addrline ... start 0)))
  (while (string-match "\\([^,]+\\)," addrline start) (let* (... ... ...) (if ... ... ...)))
  (let (addrs (start 0)) (setq addrline (concat addrline ",")) (while (string-match "\\([^,]+\\)," addrline start) (let* ... ...)) addrs)
  bbdb-rfc822-addresses("(\"\"Gro\x00df, Werner\"\") <[email-masked]>")
  bbdb-get-addresses(nil "stephen\\.berman@gmx\\.net" gnus-fetch-field)
  bbdb/gnus-update-records(nil)
  bbdb/gnus-pop-up-bbdb-buffer()
  run-hooks(gnus-article-prepare-hook)
  apply(run-hooks gnus-article-prepare-hook)
  gnus-run-hooks(gnus-article-prepare-hook)
  gnus-article-prepare-display()
  gnus-article-prepare(166195 nil)
  gnus-summary-display-article(166195)
  gnus-summary-next-article(t nil)
  gnus-summary-next-unread-article()
  call-interactively(gnus-summary-next-unread-article nil nil)

*** emacs/lisp/mail/rfc822.el.~1.28.~	2008-05-06 17:54:09.000000000 +0200
--- emacs/lisp/mail/rfc822.el	2008-06-20 17:16:10.000000000 +0200
***************
*** 278,319 ****
        (list (substring header-text (match-beginning 1) (match-end 1)))
      (let ((buf (generate-new-buffer " rfc822")))
        (unwind-protect
! 	(save-excursion
! 	  (set-buffer buf)
! 	  (make-local-variable 'case-fold-search)
! 	  (setq case-fold-search nil)	;For speed(?)
! 	  (insert header-text)
! 	  ;; unfold continuation lines
! 	  (goto-char (point-min))
  
! 	  (while (re-search-forward "\\([^\\]\\(\\\\\\\\\\)*\\)\n[ \t]" nil t)
! 	    (replace-match "\\1 " t))
  
! 	  (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@;:\\.>)]")
! 			     (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)))
! 		    (t
! 		     (setq list (nconc (nreverse tem) list)))))
! 	    (nreverse list)))
!       (and buf (kill-buffer buf))))))
  
  (provide 'rfc822)
  
--- 278,322 ----
        (list (substring header-text (match-beginning 1) (match-end 1)))
      (let ((buf (generate-new-buffer " rfc822")))
        (unwind-protect
! 	  (save-excursion
! 	    (set-buffer buf)
! 	    (make-local-variable 'case-fold-search)
! 	    (setq case-fold-search nil)	;For speed(?)
! 	    (insert header-text)
! 	    ;; unfold continuation lines
! 	    (goto-char (point-min))
  
! 	    (while (re-search-forward "\\([^\\]\\(\\\\\\\\\\)*\\)\n[ \t]" nil t)
! 	      (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)))
! 	      (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@;:\\.>)]")
! 			       (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)))
! 			(t
! 			 (setq list (nconc (nreverse tem) list)))))
! 		(nreverse list))))
! 	(and buf (kill-buffer buf))))))
  
  (provide 'rfc822)

In GNU Emacs 23.0.60.3 (i686-pc-linux-gnu, GTK+ Version 2.12.0)
 of 2008-06-16 on escher
Windowing system distributor `The X.Org Foundation', version 11.0.70200000
Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: @im=local
  locale-coding-system: utf-8-unix
  default-enable-multibyte-characters: t

Major mode: Debugger

Minor modes in effect:
  shell-dirtrack-mode: t
  show-paren-mode: t
  recentf-mode: t
  tabbar-mwheel-mode: t
  tabbar-mode: t
  display-time-mode: t
  tooltip-mode: t
  tool-bar-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  global-auto-composition-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  temp-buffer-resize-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
<switch-frame> <help-echo> <switch-frame> <down-mouse-1> 
<mouse-movement> <mouse-1> C-x o <f1> C-c j l i s <return> 
<down-mouse-1> <mouse-1> <help-echo> <select-window> 
C-u C-M-x C-c j s u m <return> n <switch-frame> C-x 
b SPC r <tab> <return> <switch-frame> f f f f f f f 
f f f f f f f f f f f f f f f f f f f f f f f <switch-frame> 
C-x b SPC r <tab> <return> <right> <left> <down-mouse-1> 
<mouse-movement> <mouse-movement> <drag-mouse-1> C-x 
b a <return> C-y C-x b SPC r <tab> <return> C-a <switch-frame> 
SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC 
SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC 
SPC SPC SPC SPC SPC SPC SPC i SPC SPC SPC SPC SPC SPC 
SPC SPC SPC SPC SPC q t <help-echo> <select-window> 
<down-mouse-5> <mouse-5> <double-down-mouse-5> <double-mouse-5> 
<down-mouse-5> <mouse-5> <down-mouse-5> <mouse-5> <down-mouse-5> 
<mouse-5> <double-down-mouse-5> <double-mouse-5> <triple-down-mouse-5> 
<triple-mouse-5> <down-mouse-4> <mouse-4> <double-down-mouse-4> 
<double-mouse-4> <triple-down-mouse-4> <triple-mouse-4> 
<select-window> <help-echo> <select-window> <select-window> 
<help-echo> <select-window> <help-echo> <help-echo> 
<select-window> <help-echo> <help-echo> <select-window> 
h M-u <up> <up> <f1> C-x b l i s <tab> C-g C-x b r 
<tab> <return> C-M-x C-M-y C-M-x C-x b * S <tab> u 
<tab> <return> n <f1> C-x b r <tab> <return> <down-mouse-4> 
<mouse-4> <double-down-mouse-4> <double-mouse-4> <down-mouse-4> 
<mouse-4> <down-mouse-1> <mouse-1> C-s C-w C-w C-w 
C-s C-s C-s C-s C-s C-s C-s C-M-a M-< C-c j d <return> 
M-x g u <return> <down-mouse-1> <mouse-movement> <mouse-1> 
C-x b r <tab> <return> C-x d C-g C-x b <return> <up> 
<up> <up> <up> M-x r e p o <tab> r <tab> b <tab> <return> 
<switch-frame> <down-mouse-1> <mouse-movement> <mouse-1> 
C-c j <switch-frame> C-c j e <backspace> l i s <return> 
<down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> 
<switch-frame> C-x b <return> M-x r e p o <tab> r <tab> 
b <tab> <return>

Recent messages:
Auto-saving...done
Mark saved where search started
Mark set
Auto-saving...done
Mark set
Auto-saving...done
Quit
Making completion list...
byte-code: Command attempted to use minibuffer while in minibuffer
Making completion list...

Footnotes: 
[1]  This is the article:
<http://permalink.gmane.org/gmane.linux.suse.general.german/166195>