[comp.mail.sendmail] self-references in .forward files

e07@nikhefh.nikhef.nl (Eric Wassenaar) (03/12/91)

Problem description: (all versions of sendmail)

   If a user 'foo' references himself in his own .forward file,
   it makes a big difference whether this file looks like
	foo,bar
   or like
	foo
	bar
   In the first case mail to 'foo' is forwarded to both 'foo'
   and 'bar', in the second case only to 'bar' but not to 'foo'.
   (Note that it is not required to \escape self-references.)

Analysis:

   During the forward processing, sendtolist() is called for each
   line in the .forward file. A possible self-reference is acted
   upon on a per-call basis, however.

   In the first case, sendtolist("foo,bar") will recognize the
   self-reference of 'foo', will not put 'foo' on the recipient
   list a second time, and because of the self-reference, will
   not mark the original 'foo' to be deleted from the recipient list.

   In the second case, sendtolist("foo") will recognize the self-
   reference, will not put 'foo' on the recipient list a second time,
   and not mark the original 'foo' to be deleted.
   However, sendtolist("bar") will then not see a self-reference in
   this call, and will mark the original 'foo' to be deleted from the
   recipient list by setting the QDONTSEND bit.

   A self-reference in any of the lines in the .forward file should
   be remembered, and the original 'foo' possibly be marked for
   deletion only after all lines in the file have been processed.
   The same holds when processing an :include: file.

Suggested fix:

   --- In file sendmail.h ---

	#define QSELFREF 001000 /* self-reference in alias/forward expansion */

   --- In file recipient.c module sendtolist() ---
   replace

	if (!selfref && ctladdr != NULL)
		ctladdr->q_flags |= QDONTSEND;

   by

	if (selfref && ctladdr != NULL)
		ctladdr->q_flags |= QSELFREF;

   --- In file recipient.c module include() ---
   add

	if (!bitset(QSELFREF, ctladdr->q_flags))
		ctladdr->q_flags |= QDONTSEND;

   after the loop in which sendtolist() is called repeatedly.

   --- In file alias.c module alias() ---
   add

	if (!bitset(QSELFREF, a->q_flags))
		a->q_flags |= QDONTSEND;

   after the call to sendtolist() at the end.

Eric Wassenaar
-- 
Organization: NIKHEF-H, National Institute for Nuclear and High-Energy Physics
Address: Kruislaan 409, P.O. Box 41882, 1009 DB Amsterdam, the Netherlands
Phone: +31 20 592 0412, Home: +31 20 6909449, Telefax: +31 20 592 5155
Internet: e07@nikhef.nl