*** RELEASE_NOTES.OLD	Fri Feb 10 09:55:32 1995
--- RELEASE_NOTES	Wed Mar  8 14:25:29 1995
***************
*** 1,10 ****
  			SENDMAIL RELEASE NOTES
! 	     @(#)RELEASE_NOTES	8.6.10.2 (Berkeley) 2/10/95
  
  This listing shows the version of the sendmail binary, the version
  of the sendmail configuration files, the date of release, and a
  summary of the changes in that release.
  
  8.6.10/8.6.10	95/02/10
  	SECURITY: Diagnose bogus values to some command line flags that
  		could allow trash to get into headers and qf files.
--- 1,45 ----
  			SENDMAIL RELEASE NOTES
! 	     @(#)RELEASE_NOTES	8.6.11.1 (Berkeley) 3/8/95
  
  This listing shows the version of the sendmail binary, the version
  of the sendmail configuration files, the date of release, and a
  summary of the changes in that release.
  
+ 8.6.11/8.6.11	95/03/08
+ 	The ``possible attack'' message would be logged more often
+ 		than necessary if you are using Pine as a user agent.
+ 	The wrong host would be reported in the ``possible attack''
+ 		message when attempted from IDENT.
+ 	In some cases the syslog buffer could be overflowed when
+ 		reporting the ``possible attack'' message.  This can
+ 		cause denial of service attacks.  Truncate the message
+ 		to 80 characters to prevent this problem.
+ 	When reading the IDENT response a loop is needed around the
+ 		read from the network to ensure that you don't get
+ 		partial lines.
+ 	Password entries without any shell listed (that is, a null
+ 		shell) wouldn't match as "ok".  Problem noted by
+ 		Rob McMahon.
+ 	When running BIND 4.9.x a problem could occur because the
+ 		_res.options field is initialized differently than it
+ 		was historically -- this requires that sendmail call
+ 		res_init before it tweaks any bits.
+ 	Fix an incompatibility in openxscript() between the file open mode
+ 		and the stdio mode passed to fdopen.  This caused UnixWare
+ 		2.0 to have conniptions.  Fix from Martin Sohnius of
+ 		Novell Labs Europe.
+ 	Fix problem with static linking of local getopt routine when
+ 		using GNU's ld command.  Fix from John Kennedy of
+ 		Cal State Chico.
+ 	It was possible to turn off privacy flags.  Problem noted by
+ 		*Hobbit*.
+ 	Be more paranoid about writing files.  Suggestions by *Hobbit*
+ 		and Liudvikas Bukys.
+ 	MAKEMAP: fixes for 64 bit machines (DEC Alphas in particular)
+ 		from Spider Boardman.
+ 	CONFIG: No changes (version number only, to keep it in sync
+ 		with the binaries).
+ 
  8.6.10/8.6.10	95/02/10
  	SECURITY: Diagnose bogus values to some command line flags that
  		could allow trash to get into headers and qf files.
***************
*** 46,51 ****
--- 81,88 ----
  		some cases, buffers could get trashed by map lookups
  		causing it to do unexpected things.  This also simplifies
  		some of the map code.
+ 	CONFIG: No changes (version number only, to keep it in sync
+ 		with the binaries).
  
  8.6.9/8.6.9	94/04/19
  	Do all mail delivery completely disconnected from any terminal.
*** cf/m4/version.m4.OLD	Fri Feb 10 08:14:41 1995
--- cf/m4/version.m4	Sat Mar  4 08:42:38 1995
***************
*** 32,39 ****
  # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  # SUCH DAMAGE.
  #
! VERSIONID(`@(#)version.m4	8.6.10.1 (Berkeley) 2/10/95')
  #
  divert(0)
  # Configuration version number
! DZ8.6.10
--- 32,39 ----
  # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  # SUCH DAMAGE.
  #
! VERSIONID(`@(#)version.m4	8.6.11.1 (Berkeley) 3/4/95')
  #
  divert(0)
  # Configuration version number
! DZ8.6.11
*** makemap/makemap.c.OLD	Thu Feb  9 16:54:35 1995
--- makemap/makemap.c	Mon Mar  6 13:26:59 1995
***************
*** 33,39 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)makemap.c	8.6 (Berkeley) 11/22/93";
  #endif /* not lint */
  
  #include <stdio.h>
--- 33,39 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)makemap.c	8.6.1.1 (Berkeley) 3/6/95";
  #endif /* not lint */
  
  #include <stdio.h>
***************
*** 66,72 ****
  	struct
  	{
  		char	*data;
! 		int	size;
  	} xx;
  };
  
--- 66,72 ----
  	struct
  	{
  		char	*data;
! 		size_t	size;
  	} xx;
  };
  
***************
*** 226,235 ****
--- 226,239 ----
  #ifdef NEWDB
  	  case T_HASH:
  		dbp.db = dbopen(mapname, mode, 0644, DB_HASH, NULL);
+ 		if (dbp.db != NULL)
+ 			(void) (*dbp.db->sync)(dbp.db, 0);
  		break;
  
  	  case T_BTREE:
  		dbp.db = dbopen(mapname, mode, 0644, DB_BTREE, NULL);
+ 		if (dbp.db != NULL)
+ 			(void) (*dbp.db->sync)(dbp.db, 0);
  		break;
  #endif
  
*** src/READ_ME.OLD	Thu Feb  9 12:21:39 1995
--- src/READ_ME	Sun Mar  5 12:52:35 1995
***************
*** 30,36 ****
  # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  # SUCH DAMAGE.
  #
! #	@(#)READ_ME	8.61 (Berkeley) 4/17/94
  #
  
  This directory contains the source files for sendmail.
--- 30,36 ----
  # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  # SUCH DAMAGE.
  #
! #	@(#)READ_ME	8.61.1.1 (Berkeley) 3/5/95
  #
  
  This directory contains the source files for sendmail.
***************
*** 666,671 ****
--- 666,682 ----
  	the flock() system call gives errors.  If you are running .14,
  	you must not use flock.  You can do this with -DHASFLOCK=0.
  
+ 	Around the inclusion of bind-4.9.3 & linux libc-4.6.20, the
+ 	initialization of the _res structure changed.  If /etc/hosts.conf
+ 	was configured as "hosts, bind" the resolver code could return
+ 	"Name server failure" errors.  This is supposedly fixed in
+ 	later versions of libc (>= 4.6.29?), and later versions of
+ 	sendmail (> 8.6.10) try to work around the problem.
+ 
+ 	Some older versions (< 4.6.20?) of the libc/include files conflict
+ 	with sendmail's version of cdefs.h.  Deleting sendmail's version
+ 	on those systems should be non-harmful, and new versions don't care.
+ 
  AIX
  	This version of sendmail does not support MB, MG, and MR resource
  	records, which are supported by AIX sendmail.
***************
*** 869,872 ****
  
  Eric Allman
  
! (Version 8.61, last update 4/17/94 07:05:32)
--- 880,883 ----
  
  Eric Allman
  
! (Version 8.61.1.1, last update 3/5/95 12:52:16)
*** src/conf.c.OLD	Thu Feb  9 12:21:59 1995
--- src/conf.c	Tue Mar  7 09:49:01 1995
***************
*** 33,39 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)conf.c	8.89 (Berkeley) 4/18/94";
  #endif /* not lint */
  
  # include "sendmail.h"
--- 33,39 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)conf.c	8.89.1.3 (Berkeley) 3/7/95";
  #endif /* not lint */
  
  # include "sendmail.h"
***************
*** 1402,1409 ****
  int	opterr = 1;		/* if error message should be printed */
  int	optind = 1;		/* index into parent argv vector */
  #endif
! int	optopt;			/* character checked for validity */
! char	*optarg;		/* argument associated with option */
  
  #define BADCH	(int)'?'
  #define EMSG	""
--- 1402,1409 ----
  int	opterr = 1;		/* if error message should be printed */
  int	optind = 1;		/* index into parent argv vector */
  #endif
! int	optopt = 0;		/* character checked for validity */
! char	*optarg = NULL;		/* argument associated with option */
  
  #define BADCH	(int)'?'
  #define EMSG	""
***************
*** 1543,1548 ****
--- 1543,1551 ----
  	register char *p;
  	extern char *getusershell();
  
+ 	if (shell == NULL || shell[0] == '\0')
+ 		return TRUE;
+ 
  	setusershell();
  	while ((p = getusershell()) != NULL)
  		if (strcmp(p, shell) == 0 || strcmp(p, WILDCARD_SHELL) == 0)
***************
*** 1553,1558 ****
--- 1556,1564 ----
  	register FILE *shellf;
  	char buf[MAXLINE];
  
+ 	if (shell == NULL || shell[0] == '\0')
+ 		return TRUE;
+ 
  	shellf = fopen(_PATH_SHELLS, "r");
  	if (shellf == NULL)
  	{
***************
*** 2190,2195 ****
--- 2196,2203 ----
  */
  
  #ifdef SOLARIS
+ 
+ extern int	h_errno;
  
  struct hostent *
  solaris_gethostbyname(name)
*** src/daemon.c.OLD	Thu Feb  9 17:28:51 1995
--- src/daemon.c	Tue Feb 28 15:40:25 1995
***************
*** 37,45 ****
  
  #ifndef lint
  #ifdef DAEMON
! static char sccsid[] = "@(#)daemon.c	8.48.1.2 (Berkeley) 2/9/95 (with daemon mode)";
  #else
! static char sccsid[] = "@(#)daemon.c	8.48.1.2 (Berkeley) 2/9/95 (without daemon mode)";
  #endif
  #endif /* not lint */
  
--- 37,45 ----
  
  #ifndef lint
  #ifdef DAEMON
! static char sccsid[] = "@(#)daemon.c	8.48.1.4 (Berkeley) 2/28/95 (with daemon mode)";
  #else
! static char sccsid[] = "@(#)daemon.c	8.48.1.4 (Berkeley) 2/28/95 (without daemon mode)";
  #endif
  #endif /* not lint */
  
***************
*** 995,1000 ****
--- 995,1002 ----
  	int s;
  	int i;
  	EVENT *ev;
+ 	int nleft;
+ 	char ibuf[MAXNAME + 1];
  #endif
  	static char hbuf[MAXNAME * 2 + 2];
  	extern char *hostnamebyanyaddr();
***************
*** 1030,1036 ****
  	}
  
  	/* create ident query */
! 	(void) sprintf(hbuf, "%d,%d\r\n",
  		ntohs(RealHostAddr.sin.sin_port), ntohs(la.sin.sin_port));
  
  	/* create local address */
--- 1032,1038 ----
  	}
  
  	/* create ident query */
! 	(void) sprintf(ibuf, "%d,%d\r\n",
  		ntohs(RealHostAddr.sin.sin_port), ntohs(la.sin.sin_port));
  
  	/* create local address */
***************
*** 1068,1094 ****
  	}
  
  	if (tTd(9, 10))
! 		printf("getauthinfo: sent %s", hbuf);
  
  	/* send query */
! 	if (write(s, hbuf, strlen(hbuf)) < 0)
  		goto closeident;
  
  	/* get result */
! 	i = read(s, hbuf, sizeof hbuf);
  	(void) close(s);
  	clrevent(ev);
! 	if (i <= 0)
  		goto noident;
- 	if (hbuf[--i] == '\n' && hbuf[--i] == '\r')
- 		i--;
- 	hbuf[++i] = '\0';
  
  	if (tTd(9, 3))
! 		printf("getauthinfo:  got %s\n", hbuf);
  
  	/* parse result */
! 	p = strchr(hbuf, ':');
  	if (p == NULL)
  	{
  		/* malformed response */
--- 1070,1103 ----
  	}
  
  	if (tTd(9, 10))
! 		printf("getauthinfo: sent %s", ibuf);
  
  	/* send query */
! 	if (write(s, ibuf, strlen(ibuf)) < 0)
  		goto closeident;
  
  	/* get result */
! 	p = &ibuf[0];
! 	nleft = sizeof(ibuf - 1);
! 	while ((i = read(s, p, nleft)) > 0)
! 	{
! 		p += i;
! 		nleft -= i;
! 	}
  	(void) close(s);
  	clrevent(ev);
! 	if (i < 0 || p == &ibuf[0])
  		goto noident;
  
+ 	if (*--p == '\n' && *--p == '\r')
+ 		p--;
+ 	*++p = '\0';
+ 
  	if (tTd(9, 3))
! 		printf("getauthinfo:  got %s\n", ibuf);
  
  	/* parse result */
! 	p = strchr(ibuf, ':');
  	if (p == NULL)
  	{
  		/* malformed response */
*** src/deliver.c.OLD	Sun Mar  5 08:28:25 1995
--- src/deliver.c	Sun Mar  5 14:55:38 1995
***************
*** 33,39 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)deliver.c	8.84.1.1 (Berkeley) 2/10/95";
  #endif /* not lint */
  
  #include "sendmail.h"
--- 33,39 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)deliver.c	8.84.1.3 (Berkeley) 3/5/95";
  #endif /* not lint */
  
  #include "sendmail.h"
***************
*** 1181,1186 ****
--- 1181,1192 ----
  			extern char **environ;
  			extern int DtableSize;
  
+ 			if (e->e_lockfp != NULL)
+ 			{
+ 				fclose(e->e_lockfp);
+ 				e->e_lockfp = NULL;
+ 			}
+ 
  			/* child -- set up input & exec mailer */
  			(void) setsignal(SIGINT, SIG_IGN);
  			(void) setsignal(SIGHUP, SIG_IGN);
***************
*** 2176,2183 ****
--- 2182,2197 ----
  	{
  		/* child -- actually write to file */
  		struct stat stb;
+ 		struct stat fsb;
  		MCI mcibuf;
+ 		int oflags = O_WRONLY|O_APPEND;
  
+ 		if (e->e_lockfp != NULL)
+ 		{
+ 			fclose(e->e_lockfp);
+ 			e->e_lockfp = NULL;
+ 		}
+ 
  		(void) setsignal(SIGINT, SIG_DFL);
  		(void) setsignal(SIGHUP, SIG_DFL);
  		(void) setsignal(SIGTERM, SIG_DFL);
***************
*** 2184,2190 ****
--- 2198,2209 ----
  		(void) umask(OldUmask);
  
  		if (stat(filename, &stb) < 0)
+ 		{
  			stb.st_mode = FileMode;
+ 			oflags |= O_CREAT|O_EXCL;
+ 		}
+ 		else if (bitset(0111, stb.st_mode))
+ 			exit(EX_CANTCREAT);
  		mode = stb.st_mode;
  
  		/* limit the errors to those actually caused in the child */
***************
*** 2191,2198 ****
  		errno = 0;
  		ExitStat = EX_OK;
  
- 		if (bitset(0111, stb.st_mode))
- 			exit(EX_CANTCREAT);
  		if (ctladdr != NULL)
  		{
  			/* ignore setuid and setgid bits */
--- 2210,2215 ----
***************
*** 2232,2241 ****
  		}
  		FileName = filename;
  		LineNumber = 0;
! 		f = dfopen(filename, O_WRONLY|O_CREAT|O_APPEND, FileMode);
  		if (f == NULL)
  		{
  			message("554 cannot open: %s", errstring(errno));
  			exit(EX_CANTCREAT);
  		}
  
--- 2249,2268 ----
  		}
  		FileName = filename;
  		LineNumber = 0;
! 		f = dfopen(filename, oflags, FileMode);
  		if (f == NULL)
  		{
  			message("554 cannot open: %s", errstring(errno));
+ 			exit(EX_CANTCREAT);
+ 		}
+ 		if (fstat(fileno(f), &fsb) < 0 ||
+ 		    !bitset(O_CREAT, oflags) &&
+ 		     (stb.st_nlink != fsb.st_nlink ||
+ 		      stb.st_dev != fsb.st_dev ||
+ 		      stb.st_ino != fsb.st_ino ||
+ 		      stb.st_uid != fsb.st_uid))
+ 		{
+ 			message("554 cannot write: file changed after open");
  			exit(EX_CANTCREAT);
  		}
  
*** src/domain.c.OLD	Thu Feb  9 12:21:48 1995
--- src/domain.c	Mon Mar  6 16:03:01 1995
***************
*** 36,44 ****
  
  #ifndef lint
  #if NAMED_BIND
! static char sccsid[] = "@(#)domain.c	8.19 (Berkeley) 3/11/94 (with name server)";
  #else
! static char sccsid[] = "@(#)domain.c	8.19 (Berkeley) 3/11/94 (without name server)";
  #endif
  #endif /* not lint */
  
--- 36,44 ----
  
  #ifndef lint
  #if NAMED_BIND
! static char sccsid[] = "@(#)domain.c	8.19.1.1 (Berkeley) 3/6/95 (with name server)";
  #else
! static char sccsid[] = "@(#)domain.c	8.19.1.1 (Berkeley) 3/6/95 (without name server)";
  #endif
  #endif /* not lint */
  
***************
*** 709,714 ****
--- 709,715 ----
  	fname = getenv("HOSTALIASES");
  	if (fname == NULL || (fp = fopen(fname, "r")) == NULL)
  		return NULL;
+ 	setbuf(fp, NULL);
  	while (fgets(buf, sizeof buf, fp) != NULL)
  	{
  		for (p = buf; p != '\0' && !(isascii(*p) && isspace(*p)); p++)
*** src/envelope.c.OLD	Thu Feb  9 12:21:46 1995
--- src/envelope.c	Tue Feb 28 13:25:41 1995
***************
*** 33,39 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)envelope.c	8.34 (Berkeley) 4/14/94";
  #endif /* not lint */
  
  #include "sendmail.h"
--- 33,39 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)envelope.c	8.34.1.1 (Berkeley) 2/28/95";
  #endif /* not lint */
  
  #include "sendmail.h"
***************
*** 489,495 ****
  		if (fd < 0)
  			syserr("!Can't open /dev/null");
  	}
! 	e->e_xfp = fdopen(fd, "w");
  	if (e->e_xfp == NULL)
  	{
  		syserr("!Can't create transcript stream %s", p);
--- 489,495 ----
  		if (fd < 0)
  			syserr("!Can't open /dev/null");
  	}
! 	e->e_xfp = fdopen(fd, "a");
  	if (e->e_xfp == NULL)
  	{
  		syserr("!Can't create transcript stream %s", p);
*** src/main.c.OLD	Fri Feb 10 09:40:49 1995
--- src/main.c	Sun Mar  5 10:10:07 1995
***************
*** 39,45 ****
  #endif /* not lint */
  
  #ifndef lint
! static char sccsid[] = "@(#)main.c	8.55.1.3 (Berkeley) 2/10/95";
  #endif /* not lint */
  
  #define	_DEFINE
--- 39,45 ----
  #endif /* not lint */
  
  #ifndef lint
! static char sccsid[] = "@(#)main.c	8.55.1.7 (Berkeley) 3/5/95";
  #endif /* not lint */
  
  #define	_DEFINE
***************
*** 293,299 ****
  
  	for (i = j = 0; j < MAXUSERENVIRON && (p = envp[i]) != NULL; i++)
  	{
! 		if (strncmp(p, "FS=", 3) == 0 || strncmp(p, "LD_", 3) == 0)
  			continue;
  		UserEnviron[j++] = newstr(p);
  	}
--- 293,299 ----
  
  	for (i = j = 0; j < MAXUSERENVIRON && (p = envp[i]) != NULL; i++)
  	{
! 		if (strncmp(p, "IFS=", 4) == 0 || strncmp(p, "LD_", 3) == 0)
  			continue;
  		UserEnviron[j++] = newstr(p);
  	}
***************
*** 324,330 ****
--- 324,333 ----
  
  #if NAMED_BIND
  	if (tTd(8, 8))
+ 	{
+ 		res_init();
  		_res.options |= RES_DEBUG;
+ 	}
  #endif
  
  	errno = 0;
***************
*** 490,496 ****
  				ExitStat = EX_USAGE;
  				break;
  			}
! 			from = newstr(denlstring(optarg));
  			if (strcmp(RealUserName, from) != 0)
  				warn_f_flag = j;
  			break;
--- 493,499 ----
  				ExitStat = EX_USAGE;
  				break;
  			}
! 			from = newstr(denlstring(optarg, TRUE, TRUE));
  			if (strcmp(RealUserName, from) != 0)
  				warn_f_flag = j;
  			break;
***************
*** 571,576 ****
--- 574,580 ----
  			break;
  
  		  case 'X':	/* traffic log file */
+ 			setgid(RealGid);
  			setuid(RealUid);
  			TrafficLogFile = fopen(optarg, "a");
  			if (TrafficLogFile == NULL)
***************
*** 654,659 ****
--- 658,672 ----
  	}
  
  	/*
+ 	**  Initialize name server if it is going to be used.
+ 	*/
+ 
+ #if NAMED_BIND
+ 	if (!bitset(RES_INIT, _res.options))
+ 		res_init();
+ #endif
+ 
+ 	/*
  	**  Process authorization warnings from command line.
  	*/
  
***************
*** 730,736 ****
  
  	/* full names can't have newlines */
  	if (FullName != NULL && strchr(FullName, '\n') != NULL)
! 		FullName = newstr(denlstring(FullName));
  
  	/* do heuristic mode adjustment */
  	if (Verbose)
--- 743,749 ----
  
  	/* full names can't have newlines */
  	if (FullName != NULL && strchr(FullName, '\n') != NULL)
! 		FullName = newstr(denlstring(FullName, TRUE, TRUE));
  
  	/* do heuristic mode adjustment */
  	if (Verbose)
*** src/queue.c.OLD	Fri Feb 10 07:38:11 1995
--- src/queue.c	Sun Mar  5 10:10:09 1995
***************
*** 36,44 ****
  
  #ifndef lint
  #ifdef QUEUE
! static char sccsid[] = "@(#)queue.c	8.41.1.1 (Berkeley) 2/10/95 (with queueing)";
  #else
! static char sccsid[] = "@(#)queue.c	8.41.1.1 (Berkeley) 2/10/95 (without queueing)";
  #endif
  #endif /* not lint */
  
--- 36,44 ----
  
  #ifndef lint
  #ifdef QUEUE
! static char sccsid[] = "@(#)queue.c	8.41.1.3 (Berkeley) 3/5/95 (with queueing)";
  #else
! static char sccsid[] = "@(#)queue.c	8.41.1.3 (Berkeley) 3/5/95 (without queueing)";
  #endif
  #endif /* not lint */
  
***************
*** 210,216 ****
  
  	/* message from envelope, if it exists */
  	if (e->e_message != NULL)
! 		fprintf(tfp, "M%s\n", denlstring(e->e_message));
  
  	/* send various flag bits through */
  	p = buf;
--- 210,216 ----
  
  	/* message from envelope, if it exists */
  	if (e->e_message != NULL)
! 		fprintf(tfp, "M%s\n", denlstring(e->e_message, TRUE, FALSE));
  
  	/* send various flag bits through */
  	p = buf;
***************
*** 224,237 ****
  
  	/* $r and $s and $_ macro values */
  	if ((p = macvalue('r', e)) != NULL)
! 		fprintf(tfp, "$r%s\n", denlstring(p));
  	if ((p = macvalue('s', e)) != NULL)
! 		fprintf(tfp, "$s%s\n", denlstring(p));
  	if ((p = macvalue('_', e)) != NULL)
! 		fprintf(tfp, "$_%s\n", denlstring(p));
  
  	/* output name of sender */
! 	fprintf(tfp, "S%s\n", denlstring(e->e_from.q_paddr));
  
  	/* output list of error recipients */
  	printctladdr(NULL, NULL);
--- 224,237 ----
  
  	/* $r and $s and $_ macro values */
  	if ((p = macvalue('r', e)) != NULL)
! 		fprintf(tfp, "$r%s\n", denlstring(p, TRUE, FALSE));
  	if ((p = macvalue('s', e)) != NULL)
! 		fprintf(tfp, "$s%s\n", denlstring(p, TRUE, FALSE));
  	if ((p = macvalue('_', e)) != NULL)
! 		fprintf(tfp, "$_%s\n", denlstring(p, TRUE, FALSE));
  
  	/* output name of sender */
! 	fprintf(tfp, "S%s\n", denlstring(e->e_from.q_paddr, TRUE, FALSE));
  
  	/* output list of error recipients */
  	printctladdr(NULL, NULL);
***************
*** 240,246 ****
  		if (!bitset(QDONTSEND|QBADADDR, q->q_flags))
  		{
  			printctladdr(q, tfp);
! 			fprintf(tfp, "E%s\n", denlstring(q->q_paddr));
  		}
  	}
  
--- 240,246 ----
  		if (!bitset(QDONTSEND|QBADADDR, q->q_flags))
  		{
  			printctladdr(q, tfp);
! 			fprintf(tfp, "E%s\n", denlstring(q->q_paddr, TRUE, FALSE));
  		}
  	}
  
***************
*** 251,257 ****
  		    (queueall && !bitset(QDONTSEND|QBADADDR|QSENT, q->q_flags)))
  		{
  			printctladdr(q, tfp);
! 			fprintf(tfp, "R%s\n", denlstring(q->q_paddr));
  			if (announce)
  			{
  				e->e_to = q->q_paddr;
--- 251,257 ----
  		    (queueall && !bitset(QDONTSEND|QBADADDR|QSENT, q->q_flags)))
  		{
  			printctladdr(q, tfp);
! 			fprintf(tfp, "R%s\n", denlstring(q->q_paddr, TRUE, FALSE));
  			if (announce)
  			{
  				e->e_to = q->q_paddr;
***************
*** 427,433 ****
  	else
  		uname = pw->pw_name;
  
! 	fprintf(tfp, "C%s:%s\n", uname, denlstring(a->q_paddr));
  }
  
  /*
--- 427,433 ----
  	else
  		uname = pw->pw_name;
  
! 	fprintf(tfp, "C%s:%s\n", uname, denlstring(a->q_paddr, TRUE, FALSE));
  }
  
  /*
*** src/recipient.c.OLD	Mon Feb 20 17:31:39 1995
--- src/recipient.c	Sun Mar  5 10:10:06 1995
***************
*** 33,39 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)recipient.c	8.44.1.4 (Berkeley) 2/20/95";
  #endif /* not lint */
  
  # include "sendmail.h"
--- 33,39 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)recipient.c	8.44.1.6 (Berkeley) 3/5/95";
  #endif /* not lint */
  
  # include "sendmail.h"
***************
*** 111,117 ****
  		bufp = buf;
  	else
  		bufp = xalloc(i);
! 	strcpy(bufp, denlstring(list));
  
  	for (p = bufp; *p != '\0'; )
  	{
--- 111,117 ----
  		bufp = buf;
  	else
  		bufp = xalloc(i);
! 	strcpy(bufp, denlstring(list, FALSE, TRUE));
  
  	for (p = bufp; *p != '\0'; )
  	{
*** src/sendmail.h.OLD	Tue Mar  7 16:22:14 1995
--- src/sendmail.h	Sun Mar  5 09:58:06 1995
***************
*** 31,37 ****
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   *
!  *	@(#)sendmail.h	8.43.1.1 (Berkeley) 2/10/95
   */
  
  /*
--- 31,37 ----
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   *
!  *	@(#)sendmail.h	8.43.1.3 (Berkeley) 3/5/95
   */
  
  /*
***************
*** 41,47 ****
  # ifdef _DEFINE
  # define EXTERN
  # ifndef lint
! static char SmailSccsId[] =	"@(#)sendmail.h	8.43.1.1		2/10/95";
  # endif
  # else /*  _DEFINE */
  # define EXTERN extern
--- 41,47 ----
  # ifdef _DEFINE
  # define EXTERN
  # ifndef lint
! static char SmailSccsId[] =	"@(#)sendmail.h	8.43.1.3		3/5/95";
  # endif
  # else /*  _DEFINE */
  # define EXTERN extern
***************
*** 956,962 ****
  extern char		*shortenstring __P((char *, int));
  extern bool		usershellok __P((char *));
  extern void		commaize __P((HDR *, char *, int, MCI *, ENVELOPE *));
! extern char		*denlstring __P((char *));
  
  /* ellipsis is a different case though */
  #ifdef __STDC__
--- 956,962 ----
  extern char		*shortenstring __P((char *, int));
  extern bool		usershellok __P((char *));
  extern void		commaize __P((HDR *, char *, int, MCI *, ENVELOPE *));
! extern char		*denlstring __P((char *, int, int));
  
  /* ellipsis is a different case though */
  #ifdef __STDC__
*** src/util.c.OLD	Tue Feb 28 08:11:27 1995
--- src/util.c	Sun Mar  5 10:10:07 1995
***************
*** 33,39 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)util.c	8.39.1.2 (Berkeley) 2/10/95";
  #endif /* not lint */
  
  # include "sendmail.h"
--- 33,39 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)util.c	8.39.1.5 (Berkeley) 3/5/95";
  #endif /* not lint */
  
  # include "sendmail.h"
***************
*** 1485,1491 ****
  {
  #ifdef LOG
  	/* check for newlines and log if necessary */
! 	(void) denlstring(f);
  #endif
  
  	l--;
--- 1485,1491 ----
  {
  #ifdef LOG
  	/* check for newlines and log if necessary */
! 	(void) denlstring(f, TRUE, TRUE);
  #endif
  
  	l--;
***************
*** 1506,1511 ****
--- 1506,1513 ----
  **
  **	Parameters:
  **		s -- the input string
+ **		strict -- if set, don't permit continuation lines.
+ **		logattacks -- if set, log attempted attacks.
  **
  **	Returns:
  **		A pointer to a version of the string with newlines
***************
*** 1513,1520 ****
  */
  
  char *
! denlstring(s)
  	char *s;
  {
  	register char *p;
  	int l;
--- 1515,1524 ----
  */
  
  char *
! denlstring(s, strict, logattacks)
  	char *s;
+ 	int strict;
+ 	int logattacks;
  {
  	register char *p;
  	int l;
***************
*** 1521,1527 ****
  	static char *bp = NULL;
  	static int bl = 0;
  
! 	if (strchr(s, '\n') == NULL)
  		return s;
  
  	l = strlen(s) + 1;
--- 1525,1535 ----
  	static char *bp = NULL;
  	static int bl = 0;
  
! 	p = s;
! 	while ((p = strchr(p, '\n')) != NULL)
! 		if (strict || (*++p != ' ' && *p != '\t'))
! 			break;
! 	if (p == NULL)
  		return s;
  
  	l = strlen(s) + 1;
***************
*** 1538,1546 ****
  		*p++ = ' ';
  
  #ifdef LOG
! 	p = macvalue('_', CurEnv);
! 	syslog(LOG_ALERT, "POSSIBLE ATTACK from %s: newline in string \"%s\"",
! 		p == NULL ? "[UNKNOWN]" : p, bp);
  #endif
  
  	return bp;
--- 1546,1557 ----
  		*p++ = ' ';
  
  #ifdef LOG
! 	if (logattacks)
! 	{
! 		syslog(LOG_NOTICE, "POSSIBLE ATTACK from %s: newline in string \"%s\"",
! 			RealHostName == NULL ? "[UNKNOWN]" : RealHostName,
! 			shortenstring(bp, 80));
! 	}
  #endif
  
  	return bp;
*** src/version.c.OLD	Tue Feb 28 08:35:57 1995
--- src/version.c	Tue Feb 28 11:11:00 1995
***************
*** 33,39 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)version.c	8.6.10.1 (Berkeley) 2/7/95";
  #endif /* not lint */
  
! char	Version[] = "8.6.10";
--- 33,39 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#)version.c	8.6.11.1 (Berkeley) 2/28/95";
  #endif /* not lint */
  
! char	Version[] = "8.6.11";
