Apply this patch to update an 8.6.3 sendmail to 8.6.4. THIS IS A CRITICAL PATCH! There were some bugs in 8.6.3 that caused core dumps and other serious problems. It also includes some patches designed to completely thwart a class of security problems that have been causing a lot of grief recently. *** RELEASE_NOTES.OLD Sun Oct 24 16:55:04 1993 --- RELEASE_NOTES Sun Oct 31 13:04:54 1993 *************** *** 1,3 **** --- 1,51 ---- + 8.6.4/8.6.4 93/10/31 + Repair core-dump problem (write to read-only memory segment) + if you fall back to the return-to-Postmaster case in + savemail. Problem reported by Richard Liu. + Immediately diagnose bogus sender addresses in SMTP. This + makes quite certain that crackers can't use this + class of attack. + Reliability Fix: check return value from fclose() and fsync() + in a few critical places. + Minor problem in initsys() that reversed a condition for + redirecting the output channel on queue runs. It's + not clear this code even does anything. From Eric + Wassenaar of the Dutch National Institute for Nuclear + and High-Energy Physics. + Fix some problems that caused queue runs to do "too much work", + such as double-reading the Errors-To: header. From + Eric Wassenaar. + Error messages on writing the temporary file (including the + data file) were getting suppressed in SMTP -- this + fix causes them to be properly reported. From Eric + Wassenaar. + Some changes to support AF_UNIX sockets -- this will only + really become relevant in the next release, but some + people need it for local patches. From Michael + Corrigan of UC San Diego. + Use dynamically allocated memory (instead of static buffers) + for macros defined in initsys() and settime(); since + these can have different values depending on which + envelope they are in. From Eric Wassenaar. + Improve logging to show ctladdr on to= logging; this tells you + what uid/gid processes ran as. + Fix a problem that caused error messages to be discarded if + the sender address was unparseable for some reason; + this was supposed to fall back to the "return to + postmaster" case. + Improve aliaswait backoff algorithm. + Portability patches for Linux (8.6.3 required another header + file) (from Karl London) and SCO UNIX. + CONFIG: patch prog mailer to not strip host name off of envelope + addresses (so that it matches local again). From + Christopher Davis. + CONFIG: change uucp-dom mailer so that "<>" translates to $n; + this prevents uux from seeing lines with null names like + ``From Sat Oct 30 14:55:31 1993''. From Motonori + Nakamura of Kyoto University. + CONFIG: handle syntax correctly. This isn't legal, but + it shouldn't fail miserably. From Motonori Nakamura. + 8.6.3/8.6.3 93/10/24 IMPORTANT FIX: Fix several problems that caused open files to be "lost" during queue runs; this overflowed the open *** KNOWNBUGS.OLD Thu Oct 28 09:28:23 1993 --- KNOWNBUGS Sun Oct 31 11:39:06 1993 *************** *** 43,51 **** hub name. Some sites might prefer to expose some names such as root. This information is always available in Received: lines. * If you EXPN a list or user that has a program mailer, the output of EXPN will include ``@local.host.name''. You can't actually mail to this address. It's not clear what the right behaviour is in this circumstance. ! (Version 8.8, last updated 10/24/93) --- 43,59 ---- hub name. Some sites might prefer to expose some names such as root. This information is always available in Received: lines. + * $c (hop count) macro improperly set. + + The $c macro is supposed to contain the current hop count, for use + when calling a mailer. This macro is initialized too early, and + is always zero (or the value of the -c command line flag, if any). + This macro will probably be removed entirely in a future release; + I don't believe there are any mailers left that require it. + * If you EXPN a list or user that has a program mailer, the output of EXPN will include ``@local.host.name''. You can't actually mail to this address. It's not clear what the right behaviour is in this circumstance. ! (Version 8.9, last updated 10/31/93) *** src/Makefile.Linux.OLD Wed Oct 27 06:48:26 1993 --- src/Makefile.Linux Thu Oct 28 07:02:16 1993 *************** *** 35,53 **** LIBS= -lbsd -ldbm # location of sendmail binary (usually /usr/sbin or /usr/lib) ! BINDIR= ${DESTDIR}/etc/sendmail # location of sendmail.st file (usually /var/log or /usr/lib) ! STDIR= ${DESTDIR}/etc/sendmail # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) ! HFDIR= ${DESTDIR}/etc/sendmail # additional .o files needed OBJADD= # additional pseudo-sources needed ! BEFORE= unistd.h dirent.h ################### end of user configuration flags ###################### --- 35,53 ---- LIBS= -lbsd -ldbm # location of sendmail binary (usually /usr/sbin or /usr/lib) ! BINDIR= ${DESTDIR}/usr/lib # location of sendmail.st file (usually /var/log or /usr/lib) ! STDIR= ${DESTDIR}/usr/lib # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) ! HFDIR= ${DESTDIR}/usr/lib # additional .o files needed OBJADD= # additional pseudo-sources needed ! BEFORE= ################### end of user configuration flags ###################### *************** *** 78,91 **** echo "#include " > dirent.h echo "#define dirent direct" >> dirent.h aliases.0: aliases.5 ! nroff -mandoc aliases.5 > aliases.0 newaliases.0: newaliases.1 ! nroff -mandoc newaliases.1 > newaliases.0 sendmail.0: sendmail.8 ! nroff -mandoc sendmail.8 > sendmail.0 install: install-sendmail install-docs --- 78,93 ---- echo "#include " > dirent.h echo "#define dirent direct" >> dirent.h + NROFF= nroff + aliases.0: aliases.5 ! ${NROFF} -mandoc aliases.5 > aliases.0 newaliases.0: newaliases.1 ! ${NROFF} -mandoc newaliases.1 > newaliases.0 sendmail.0: sendmail.8 ! ${NROFF} -mandoc sendmail.8 > sendmail.0 install: install-sendmail install-docs *** src/Makefile.OSF1.OLD Mon Oct 25 12:38:03 1993 --- src/Makefile.OSF1 Mon Oct 25 12:39:01 1993 *************** *** 83,92 **** install: install-sendmail install-docs install-sendmail: sendmail ! install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done cp /dev/null ${STDIR}/sendmail.st ! chmod ${BINMOD}.${BINGRP} ${STDIR}/sendmail.st installbsd -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} rm -f /usr/sbin/smtpd --- 83,93 ---- install: install-sendmail install-docs install-sendmail: sendmail ! installbsd -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done cp /dev/null ${STDIR}/sendmail.st ! chmod ${BINMOD} ${STDIR}/sendmail.st ! chown ${BINGRP}.${BINGRP} ${STDIR}/sendmail.st installbsd -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} rm -f /usr/sbin/smtpd *** src/Makefile.SunOS.OLD Sun Oct 24 13:39:28 1993 --- src/Makefile.SunOS Sun Oct 24 13:39:49 1993 *************** *** 41,47 **** BINDIR= ${DESTDIR}/usr/lib # location of sendmail.st file (usually /var/log or /usr/lib) ! STDIR= ${DESTDIR}/var/log # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) HFDIR= ${DESTDIR}/usr/lib --- 41,47 ---- BINDIR= ${DESTDIR}/usr/lib # location of sendmail.st file (usually /var/log or /usr/lib) ! STDIR= ${DESTDIR}/etc # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) HFDIR= ${DESTDIR}/usr/lib *** src/READ_ME.OLD Wed Oct 27 08:24:33 1993 --- src/READ_ME Sun Oct 31 11:33:11 1993 *************** *** 30,36 **** # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ! # @(#)READ_ME 8.30 (Berkeley) 10/24/93 # 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.31 (Berkeley) 10/31/93 # This directory contains the source files for sendmail. *************** *** 265,270 **** --- 265,276 ---- this links in a new version of gethostbyname that does not understand NIS, so you must have all of your hosts in DNS. + Some people have reported problems with the SunOS version of + -lresolv and/or in.named, and suggest that you get a newer + version. The symptoms are delays when you connect to the + SMTP server on a SunOS machine. There is a version of BIND + version 4.9 on gatekeeper.DEC.COM in pub/BSD/bind/4.9. + There is substantial disagreement about whether you can make this work with resolv+, which allows you to specify a search-path of services. Some people report that it works fine, others *************** *** 483,486 **** Eric Allman ! (Version 8.30, last update 10/24/93 10:39:02) --- 489,492 ---- Eric Allman ! (Version 8.31, last update 10/31/93 11:32:52) *** src/alias.c.OLD Fri Oct 29 07:00:24 1993 --- src/alias.c Sun Oct 31 11:07:17 1993 *************** *** 36,42 **** # include #ifndef lint ! static char sccsid[] = "@(#)alias.c 8.17 (Berkeley) 10/15/93"; #endif /* not lint */ --- 36,42 ---- # include #ifndef lint ! static char sccsid[] = "@(#)alias.c 8.19 (Berkeley) 10/31/93"; #endif /* not lint */ *************** *** 299,305 **** char *ext; int isopen; { ! int atcnt; time_t mtime; struct stat stb; char buf[MAXNAME]; --- 299,305 ---- char *ext; int isopen; { ! bool attimeout = FALSE; time_t mtime; struct stat stb; char buf[MAXNAME]; *************** *** 308,324 **** printf("aliaswait(%s:%s)\n", map->map_class->map_cname, map->map_file); if (bitset(MF_ALIASWAIT, map->map_mflags)) ! return; map->map_mflags |= MF_ALIASWAIT; ! atcnt = SafeAlias * 2; ! if (atcnt > 0) { auto int st; ! while (isopen && atcnt-- >= 0 && map->map_class->map_lookup(map, "@", NULL, &st) == NULL) { /* ** Close and re-open the alias database in case ** the one is mv'ed instead of cp'ed in. --- 308,332 ---- printf("aliaswait(%s:%s)\n", map->map_class->map_cname, map->map_file); if (bitset(MF_ALIASWAIT, map->map_mflags)) ! return isopen; map->map_mflags |= MF_ALIASWAIT; ! if (SafeAlias > 0) { auto int st; + time_t toolong = curtime() + SafeAlias; + unsigned int sleeptime = 2; ! while (isopen && map->map_class->map_lookup(map, "@", NULL, &st) == NULL) { + if (curtime() > toolong) + { + /* we timed out */ + attimeout = TRUE; + break; + } + /* ** Close and re-open the alias database in case ** the one is mv'ed instead of cp'ed in. *************** *** 325,334 **** */ if (tTd(27, 2)) ! printf("aliaswait: sleeping\n"); map->map_class->map_close(map); ! sleep(30); isopen = map->map_class->map_open(map, O_RDONLY); } } --- 333,346 ---- */ if (tTd(27, 2)) ! printf("aliaswait: sleeping for %d seconds\n", ! sleeptime); map->map_class->map_close(map); ! sleep(sleeptime); ! sleeptime *= 2; ! if (sleeptime > 60) ! sleeptime = 60; isopen = map->map_class->map_open(map, O_RDONLY); } } *************** *** 352,358 **** (void) strcpy(buf, map->map_file); if (ext != NULL) (void) strcat(buf, ext); ! if (stat(buf, &stb) < 0 || stb.st_mtime < mtime || atcnt < 0) { /* database is out of date */ if (AutoRebuild && stb.st_ino != 0 && stb.st_uid == geteuid()) --- 364,370 ---- (void) strcpy(buf, map->map_file); if (ext != NULL) (void) strcat(buf, ext); ! if (stat(buf, &stb) < 0 || stb.st_mtime < mtime || attimeout) { /* database is out of date */ if (AutoRebuild && stb.st_ino != 0 && stb.st_uid == geteuid()) *************** *** 437,443 **** (void) lockfile(fileno(af), map->map_file, NULL, LOCK_EX); } ! (void) fclose(af); errno = 0; return; } --- 449,455 ---- (void) lockfile(fileno(af), map->map_file, NULL, LOCK_EX); } ! (void) xfclose(af, "rebuildaliases1", map->map_file); errno = 0; return; } *************** *** 468,474 **** } /* close the file, thus releasing locks */ ! fclose(af); /* add distinguished entries and close the database */ if (bitset(MF_OPEN, map->map_mflags)) --- 480,486 ---- } /* close the file, thus releasing locks */ ! xfclose(af, "rebuildaliases2", map->map_file); /* add distinguished entries and close the database */ if (bitset(MF_OPEN, map->map_mflags)) *** src/collect.c.OLD Wed Oct 27 08:30:13 1993 --- src/collect.c Fri Oct 29 07:04:42 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)collect.c 8.5 (Berkeley) 10/15/93"; #endif /* not lint */ # include --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)collect.c 8.6 (Berkeley) 10/27/93"; #endif /* not lint */ # include *************** *** 283,290 **** if (fflush(tf) != 0) tferror(tf, e); ! (void) fsync(fileno(tf)); ! (void) fclose(tf); /* An EOF when running SMTP is an error */ if (inputerr && OpMode == MD_SMTP) --- 283,293 ---- if (fflush(tf) != 0) tferror(tf, e); ! if (fsync(fileno(tf)) < 0 || fclose(tf) < 0) ! { ! syserr("cannot sync message data to disk (%s)", e->e_df); ! finis(); ! } /* An EOF when running SMTP is an error */ if (inputerr && OpMode == MD_SMTP) *** src/conf.h.OLD Thu Oct 28 06:45:24 1993 --- src/conf.h Fri Oct 29 06:44:30 1993 *************** *** 31,37 **** * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)conf.h 8.42 (Berkeley) 10/21/93 */ /* --- 31,37 ---- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)conf.h 8.44 (Berkeley) 10/29/93 */ /* *************** *** 382,388 **** ** From Karl London . */ ! #ifdef linux # define BSD 1 /* pretend to be BSD based today */ # undef NEEDVPRINTF 1 /* need a replacement for vprintf(3) */ # define NEEDGETOPT 1 /* need a replacement for getopt(3) */ --- 382,388 ---- ** From Karl London . */ ! #ifdef __linux__ # define BSD 1 /* pretend to be BSD based today */ # undef NEEDVPRINTF 1 /* need a replacement for vprintf(3) */ # define NEEDGETOPT 1 /* need a replacement for getopt(3) */ *************** *** 390,395 **** --- 390,396 ---- # ifndef LA_TYPE # define LA_TYPE LA_FLOAT # endif + # include #endif *** src/daemon.c.OLD Sun Oct 24 13:59:30 1993 --- src/daemon.c Sun Oct 31 11:30:14 1993 *************** *** 37,45 **** #ifndef lint #ifdef DAEMON ! static char sccsid[] = "@(#)daemon.c 8.19 (Berkeley) 10/23/93 (with daemon mode)"; #else ! static char sccsid[] = "@(#)daemon.c 8.19 (Berkeley) 10/23/93 (without daemon mode)"; #endif #endif /* not lint */ --- 37,45 ---- #ifndef lint #ifdef DAEMON ! static char sccsid[] = "@(#)daemon.c 8.21 (Berkeley) 10/31/93 (with daemon mode)"; #else ! static char sccsid[] = "@(#)daemon.c 8.21 (Berkeley) 10/31/93 (without daemon mode)"; #endif #endif /* not lint */ *************** *** 1049,1054 **** --- 1049,1055 ---- char *cp; int i; register STAB *s; + char *timeoutmsg = "Recipient domain nameserver timed out"; char hbuf[MAXNAME]; extern struct hostent *gethostbyaddr(); extern int h_errno; *************** *** 1067,1072 **** --- 1068,1075 ---- errno = s->s_namecanon.nc_errno; h_errno = s->s_namecanon.nc_herrno; *statp = s->s_namecanon.nc_stat; + if (CurEnv->e_message == NULL && *statp == EX_TEMPFAIL) + CurEnv->e_message = newstr(timeoutmsg); return s->s_namecanon.nc_cname; } *************** *** 1106,1116 **** case TRY_AGAIN: if (UseNameServer) { ! char *msg = "Recipient domain nameserver timed out"; ! ! message(msg); if (CurEnv->e_message == NULL) ! CurEnv->e_message = newstr(msg); } *statp = EX_TEMPFAIL; break; --- 1109,1117 ---- case TRY_AGAIN: if (UseNameServer) { ! message(timeoutmsg); if (CurEnv->e_message == NULL) ! CurEnv->e_message = newstr(timeoutmsg); } *statp = EX_TEMPFAIL; break; *************** *** 1200,1207 **** { #ifdef MAYBENEXTRELEASE /*** UNTESTED *** UNTESTED *** UNTESTED ***/ case AF_UNIX: ! if (sap->sun.sun_path[0] != '\0') ! sprintf(buf, "[UNIX: %.64s]", sap->sun.sun_path); else sprintf(buf, "[UNIX: localhost]"); return buf; --- 1201,1208 ---- { #ifdef MAYBENEXTRELEASE /*** UNTESTED *** UNTESTED *** UNTESTED ***/ case AF_UNIX: ! if (sap->sunix.sun_path[0] != '\0') ! sprintf(buf, "[UNIX: %.64s]", sap->sunix.sun_path); else sprintf(buf, "[UNIX: localhost]"); return buf; *** src/deliver.c.OLD Fri Oct 29 09:49:43 1993 --- src/deliver.c Fri Oct 29 19:24:45 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)deliver.c 8.36 (Berkeley) 10/23/93"; #endif /* not lint */ #include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)deliver.c 8.37 (Berkeley) 10/29/93"; #endif /* not lint */ #include "sendmail.h" *************** *** 636,642 **** e->e_to = to->q_paddr; message("queued"); if (LogLevel > 8) ! logdelivery(m, NULL, "queued", e); } e->e_to = NULL; return (0); --- 636,642 ---- e->e_to = to->q_paddr; message("queued"); if (LogLevel > 8) ! logdelivery(m, NULL, "queued", NULL, e); } e->e_to = NULL; return (0); *************** *** 780,786 **** { NoReturn = TRUE; usrerr("552 Message is too large; %ld bytes max", m->m_maxsize); ! giveresponse(EX_UNAVAILABLE, m, NULL, e); continue; } rcode = checkcompat(to, e); --- 780,786 ---- { NoReturn = TRUE; usrerr("552 Message is too large; %ld bytes max", m->m_maxsize); ! giveresponse(EX_UNAVAILABLE, m, NULL, ctladdr, e); continue; } rcode = checkcompat(to, e); *************** *** 787,793 **** if (rcode != EX_OK) { markfailure(e, to, rcode); ! giveresponse(rcode, m, NULL, e); continue; } --- 787,793 ---- if (rcode != EX_OK) { markfailure(e, to, rcode); ! giveresponse(rcode, m, NULL, ctladdr, e); continue; } *************** *** 831,838 **** if (m == FileMailer) { ! rcode = mailfile(user, getctladdr(to), e); ! giveresponse(rcode, m, NULL, e); if (rcode == EX_OK) to->q_flags |= QSENT; continue; --- 831,840 ---- if (m == FileMailer) { ! ADDRESS *caddr = getctladdr(to); ! ! rcode = mailfile(user, caddr, e); ! giveresponse(rcode, m, NULL, caddr, e); if (rcode == EX_OK) to->q_flags |= QSENT; continue; *************** *** 1372,1378 **** if ((i = smtprcpt(to, m, mci, e)) != EX_OK) { markfailure(e, to, i); ! giveresponse(i, m, mci, e); } else { --- 1374,1380 ---- if ((i = smtprcpt(to, m, mci, e)) != EX_OK) { markfailure(e, to, i); ! giveresponse(i, m, mci, ctladdr, e); } else { *************** *** 1436,1442 **** give_up: if (tobuf[0] != '\0') ! giveresponse(rcode, m, mci, e); for (to = tochain; to != NULL; to = to->q_tchain) { if (rcode != EX_OK) --- 1438,1444 ---- give_up: if (tobuf[0] != '\0') ! giveresponse(rcode, m, mci, ctladdr, e); for (to = tochain; to != NULL; to = to->q_tchain) { if (rcode != EX_OK) *************** *** 1586,1591 **** --- 1588,1595 ---- ** m -- the mailer info for this mailer. ** mci -- the mailer connection info -- can be NULL if the ** response is given before the connection is made. + ** ctladdr -- the controlling address for the recipient + ** address(es). ** e -- the current envelope. ** ** Returns: *************** *** 1596,1605 **** ** ExitStat may be set. */ ! giveresponse(stat, m, mci, e) int stat; register MAILER *m; register MCI *mci; ENVELOPE *e; { register const char *statmsg; --- 1600,1610 ---- ** ExitStat may be set. */ ! giveresponse(stat, m, mci, ctladdr, e) int stat; register MAILER *m; register MCI *mci; + ADDRESS *ctladdr; ENVELOPE *e; { register const char *statmsg; *************** *** 1701,1707 **** */ if (LogLevel > ((stat == EX_TEMPFAIL) ? 8 : (stat == EX_OK) ? 7 : 6)) ! logdelivery(m, mci, &statmsg[4], e); if (stat != EX_TEMPFAIL) setstat(stat); --- 1706,1712 ---- */ if (LogLevel > ((stat == EX_TEMPFAIL) ? 8 : (stat == EX_OK) ? 7 : 6)) ! logdelivery(m, mci, &statmsg[4], ctladdr, e); if (stat != EX_TEMPFAIL) setstat(stat); *************** *** 1724,1729 **** --- 1729,1735 ---- ** mci -- the mailer connection info -- can be NULL if the ** log is occuring when no connection is active. ** stat -- the message to print for the status. + ** ctladdr -- the controlling address for the to list. ** e -- the current envelope. ** ** Returns: *************** *** 1733,1753 **** ** none */ ! logdelivery(m, mci, stat, e) MAILER *m; register MCI *mci; char *stat; register ENVELOPE *e; { # ifdef LOG char buf[512]; ! (void) sprintf(buf, "delay=%s", pintvl(curtime() - e->e_ctime, TRUE)); if (m != NULL) { ! (void) strcat(buf, ", mailer="); ! (void) strcat(buf, m->m_name); } if (mci != NULL && mci->mci_host != NULL) --- 1739,1777 ---- ** none */ ! logdelivery(m, mci, stat, ctladdr, e) MAILER *m; register MCI *mci; char *stat; + ADDRESS *ctladdr; register ENVELOPE *e; { # ifdef LOG + register char *bp; char buf[512]; ! bp = buf; ! if (ctladdr != NULL) ! { ! strcpy(bp, ", ctladdr="); ! strcat(bp, ctladdr->q_paddr); ! bp += strlen(bp); ! if (bitset(QGOODUID, ctladdr->q_flags)) ! { ! (void) sprintf(bp, " (%d/%d)", ! ctladdr->q_uid, ctladdr->q_gid); ! bp += strlen(bp); ! } ! } + (void) sprintf(bp, ", delay=%s", pintvl(curtime() - e->e_ctime, TRUE)); + bp += strlen(bp); + if (m != NULL) { ! (void) strcpy(bp, ", mailer="); ! (void) strcat(bp, m->m_name); ! bp += strlen(bp); } if (mci != NULL && mci->mci_host != NULL) *************** *** 1756,1768 **** extern SOCKADDR CurHostAddr; # endif ! (void) strcat(buf, ", relay="); ! (void) strcat(buf, mci->mci_host); # ifdef DAEMON ! (void) strcat(buf, " ("); ! (void) strcat(buf, anynet_ntoa(&CurHostAddr)); ! (void) strcat(buf, ")"); # endif } else --- 1780,1792 ---- extern SOCKADDR CurHostAddr; # endif ! (void) strcpy(bp, ", relay="); ! (void) strcat(bp, mci->mci_host); # ifdef DAEMON ! (void) strcat(bp, " ("); ! (void) strcat(bp, anynet_ntoa(&CurHostAddr)); ! (void) strcat(bp, ")"); # endif } else *************** *** 1771,1782 **** if (p != NULL && p[0] != '\0') { ! (void) strcat(buf, ", relay="); ! (void) strcat(buf, p); } } ! syslog(LOG_INFO, "%s: to=%s, %s, stat=%s", e->e_id, e->e_to, buf, stat); # endif /* LOG */ } --- 1795,1806 ---- if (p != NULL && p[0] != '\0') { ! (void) strcpy(bp, ", relay="); ! (void) strcat(bp, p); } } ! syslog(LOG_INFO, "%s: to=%s%s, stat=%s", e->e_id, e->e_to, buf, stat); # endif /* LOG */ } *** src/envelope.c.OLD Sun Oct 24 14:28:51 1993 --- src/envelope.c Sun Oct 31 10:19:05 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)envelope.c 8.13 (Berkeley) 10/23/93"; #endif /* not lint */ #include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)envelope.c 8.17 (Berkeley) 10/31/93"; #endif /* not lint */ #include "sendmail.h" *************** *** 350,357 **** initsys(e) register ENVELOPE *e; { ! static char cbuf[5]; /* holds hop count */ ! static char pbuf[10]; /* holds pid */ #ifdef TTYNAME static char ybuf[60]; /* holds tty id */ register char *p; --- 350,357 ---- initsys(e) register ENVELOPE *e; { ! char cbuf[5]; /* holds hop count */ ! char pbuf[10]; /* holds pid */ #ifdef TTYNAME static char ybuf[60]; /* holds tty id */ register char *p; *************** *** 375,381 **** ** tucked away in the transcript). */ ! if (OpMode == MD_DAEMON && !bitset(EF_QUEUERUN, e->e_flags) && e->e_xfp != NULL) OutChannel = e->e_xfp; --- 375,381 ---- ** tucked away in the transcript). */ ! if (OpMode == MD_DAEMON && bitset(EF_QUEUERUN, e->e_flags) && e->e_xfp != NULL) OutChannel = e->e_xfp; *************** *** 385,395 **** /* process id */ (void) sprintf(pbuf, "%d", getpid()); ! define('p', pbuf, e); /* hop count */ (void) sprintf(cbuf, "%d", e->e_hopcount); ! define('c', cbuf, e); /* time as integer, unix time, arpa time */ settime(e); --- 385,395 ---- /* process id */ (void) sprintf(pbuf, "%d", getpid()); ! define('p', newstr(pbuf), e); /* hop count */ (void) sprintf(cbuf, "%d", e->e_hopcount); ! define('c', newstr(cbuf), e); /* time as integer, unix time, arpa time */ settime(e); *************** *** 428,435 **** { register char *p; auto time_t now; ! static char tbuf[20]; /* holds "current" time */ ! static char dbuf[30]; /* holds ctime(tbuf) */ register struct tm *tm; extern char *arpadate(); extern struct tm *gmtime(); --- 428,435 ---- { register char *p; auto time_t now; ! char tbuf[20]; /* holds "current" time */ ! char dbuf[30]; /* holds ctime(tbuf) */ register struct tm *tm; extern char *arpadate(); extern struct tm *gmtime(); *************** *** 438,449 **** tm = gmtime(&now); (void) sprintf(tbuf, "%04d%02d%02d%02d%02d", tm->tm_year + 1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min); ! define('t', tbuf, e); (void) strcpy(dbuf, ctime(&now)); p = strchr(dbuf, '\n'); if (p != NULL) *p = '\0'; ! define('d', dbuf, e); p = arpadate(dbuf); p = newstr(p); if (macvalue('a', e) == NULL) --- 438,449 ---- tm = gmtime(&now); (void) sprintf(tbuf, "%04d%02d%02d%02d%02d", tm->tm_year + 1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min); ! define('t', newstr(tbuf), e); (void) strcpy(dbuf, ctime(&now)); p = strchr(dbuf, '\n'); if (p != NULL) *p = '\0'; ! define('d', newstr(dbuf), e); p = arpadate(dbuf); p = newstr(p); if (macvalue('a', e) == NULL) *************** *** 592,600 **** SuprErrs = TRUE; delimchar = internal ? '\0' : ' '; if (from == NULL || parseaddr(from, &e->e_from, RF_COPYALL|RF_SENDERADDR, ! delimchar, delimptr, e) == NULL) { /* log garbage addresses for traceback */ # ifdef LOG --- 592,605 ---- SuprErrs = TRUE; delimchar = internal ? '\0' : ' '; + e->e_from.q_flags = QBADADDR; if (from == NULL || parseaddr(from, &e->e_from, RF_COPYALL|RF_SENDERADDR, ! delimchar, delimptr, e) == NULL || ! bitset(QBADADDR, e->e_from.q_flags) || ! e->e_from.q_mailer == ProgMailer || ! e->e_from.q_mailer == FileMailer || ! e->e_from.q_mailer == InclMailer) { /* log garbage addresses for traceback */ # ifdef LOG *************** *** 613,631 **** p = ebuf; } syslog(LOG_NOTICE, ! "from=%s unparseable, received from %s", from, p); } # endif /* LOG */ if (from != NULL) SuprErrs = TRUE; if (from == realname || parseaddr(from = newstr(realname), &e->e_from, RF_COPYALL|RF_SENDERADDR, ' ', NULL, e) == NULL) { SuprErrs = TRUE; ! if (parseaddr("postmaster", &e->e_from, RF_COPYALL, ! ' ', NULL, e) == NULL) syserr("553 setsender: can't even parse postmaster!"); } } --- 618,648 ---- p = ebuf; } syslog(LOG_NOTICE, ! "setsender: %s: invalid or unparseable, received from %s", from, p); } # endif /* LOG */ if (from != NULL) + { + if (!bitset(QBADADDR, e->e_from.q_flags)) + { + /* it was a bogus mailer in the from addr */ + usrerr("553 Invalid sender address"); + } SuprErrs = TRUE; + } if (from == realname || parseaddr(from = newstr(realname), &e->e_from, RF_COPYALL|RF_SENDERADDR, ' ', NULL, e) == NULL) { + char nbuf[100]; + SuprErrs = TRUE; ! expand("\201n", nbuf, &nbuf[sizeof nbuf], e); ! if (parseaddr(from = newstr(nbuf), &e->e_from, ! RF_COPYALL, ' ', NULL, e) == NULL && ! parseaddr(from = "postmaster", &e->e_from, ! RF_COPYALL, ' ', NULL, e) == NULL) syserr("553 setsender: can't even parse postmaster!"); } } *** src/err.c.OLD Thu Oct 28 18:01:18 1993 --- src/err.c Fri Oct 29 20:19:28 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)err.c 8.12 (Berkeley) 10/21/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)err.c 8.14 (Berkeley) 10/29/93"; #endif /* not lint */ # include "sendmail.h" *************** *** 341,356 **** putoutmsg(msg, HoldErrs); /* signal the error */ if (msgcode == '6') { /* notify the postmaster */ CurEnv->e_flags |= EF_PM_NOTIFY; } ! else { ! Errors++; ! if (msgcode == '5' && bitset(EF_GLOBALERRS, CurEnv->e_flags)) ! CurEnv->e_flags |= EF_FATALERRS; } } /* --- 341,356 ---- putoutmsg(msg, HoldErrs); /* signal the error */ + Errors++; if (msgcode == '6') { /* notify the postmaster */ CurEnv->e_flags |= EF_PM_NOTIFY; } ! else if (msgcode == '5' && bitset(EF_GLOBALERRS, CurEnv->e_flags)) { ! /* mark long-term fatal errors */ ! CurEnv->e_flags |= EF_FATALERRS; } } /* *** src/parseaddr.c.OLD Wed Oct 27 16:06:40 1993 --- src/parseaddr.c Sun Oct 31 10:18:01 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)parseaddr.c 8.14 (Berkeley) 10/22/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)parseaddr.c 8.17 (Berkeley) 10/31/93"; #endif /* not lint */ # include "sendmail.h" *************** *** 211,225 **** char savedelim; if (delimptr != NULL) savedelim = *delimptr; #if 0 /* for testing.... */ if (strcmp(addr, "INvalidADDR") == 0) { usrerr("553 INvalid ADDRess"); ! if (delimptr != NULL) ! *delimptr = savedelim; ! return TRUE; } #endif for (; *addr != '\0'; addr++) --- 211,227 ---- char savedelim; if (delimptr != NULL) + { savedelim = *delimptr; + if (savedelim != '\0') + *delimptr = '\0'; + } #if 0 /* for testing.... */ if (strcmp(addr, "INvalidADDR") == 0) { usrerr("553 INvalid ADDRess"); ! goto addrfailure; } #endif for (; *addr != '\0'; addr++) *************** *** 227,238 **** if ((*addr & 0340) == 0200) break; } - if (delimptr != NULL) - *delimptr = savedelim; if (*addr == '\0') return FALSE; setstat(EX_USAGE); usrerr("553 Address contained invalid control characters"); return TRUE; } /* --- 229,245 ---- if ((*addr & 0340) == 0200) break; } if (*addr == '\0') + { + if (savedelim != '\0' && delimptr != NULL) + *delimptr = savedelim; return FALSE; + } setstat(EX_USAGE); usrerr("553 Address contained invalid control characters"); + addrfailure: + if (savedelim != '\0' && delimptr != NULL) + *delimptr = savedelim; return TRUE; } /* *************** *** 406,423 **** /* diagnose and patch up bad syntax */ if (state == QST) { ! usrerr("653 Unbalanced '\"' (fixed)"); c = '"'; } else if (cmntcnt > 0) { ! usrerr("653 Unbalanced '(' (fixed)"); c = ')'; } else if (anglecnt > 0) { c = '>'; ! usrerr("653 Unbalanced '<' (fixed)"); } else break; --- 413,430 ---- /* diagnose and patch up bad syntax */ if (state == QST) { ! usrerr("653 Unbalanced '\"'"); c = '"'; } else if (cmntcnt > 0) { ! usrerr("653 Unbalanced '('"); c = ')'; } else if (anglecnt > 0) { c = '>'; ! usrerr("653 Unbalanced '<'"); } else break; *************** *** 467,473 **** { if (cmntcnt <= 0) { ! usrerr("653 Unbalanced ')' (fixed)"); c = NOCHAR; } else --- 474,480 ---- { if (cmntcnt <= 0) { ! usrerr("653 Unbalanced ')'"); c = NOCHAR; } else *************** *** 481,487 **** { if (anglecnt <= 0) { ! usrerr("653 Unbalanced '>' (fixed)"); c = NOCHAR; } else --- 488,494 ---- { if (anglecnt <= 0) { ! usrerr("653 Unbalanced '>'"); c = NOCHAR; } else *************** *** 1231,1236 **** --- 1238,1249 ---- static MAILER errormailer; static char *errorargv[] = { "ERROR", NULL }; static char buf[MAXNAME]; + + if (tTd(24, 5)) + { + printf("buildaddr, flags=%o, tv=", flags); + printav(tv); + } if (a == NULL) a = (ADDRESS *) xalloc(sizeof *a); *** src/queue.c.OLD Wed Oct 27 08:30:26 1993 --- src/queue.c Fri Oct 29 19:24:47 1993 *************** *** 36,44 **** #ifndef lint #ifdef QUEUE ! static char sccsid[] = "@(#)queue.c 8.24 (Berkeley) 10/23/93 (with queueing)"; #else ! static char sccsid[] = "@(#)queue.c 8.24 (Berkeley) 10/23/93 (without queueing)"; #endif #endif /* not lint */ --- 36,44 ---- #ifndef lint #ifdef QUEUE ! static char sccsid[] = "@(#)queue.c 8.27 (Berkeley) 10/29/93 (with queueing)"; #else ! static char sccsid[] = "@(#)queue.c 8.27 (Berkeley) 10/29/93 (without queueing)"; #endif #endif /* not lint */ *************** *** 249,255 **** e->e_to = q->q_paddr; message("queued"); if (LogLevel > 8) ! logdelivery(NULL, NULL, "queued", e); e->e_to = NULL; } if (tTd(40, 1)) --- 249,255 ---- e->e_to = q->q_paddr; message("queued"); if (LogLevel > 8) ! logdelivery(NULL, NULL, "queued", NULL, e); e->e_to = NULL; } if (tTd(40, 1)) *************** *** 332,340 **** ** Clean up. */ ! fflush(tfp); ! fsync(fileno(tfp)); ! if (ferror(tfp)) { if (newid) syserr("!552 Error writing control file %s", tf); --- 332,338 ---- ** Clean up. */ ! if (fflush(tfp) < 0 || fsync(fileno(tfp)) < 0 || ferror(tfp)) { if (newid) syserr("!552 Error writing control file %s", tf); *************** *** 874,880 **** e->e_flags |= EF_QUEUERUN|EF_GLOBALERRS; e->e_errormode = EM_MAIL; e->e_id = id; ! GrabTo = FALSE; if (forkflag) { disconnect(1, e); --- 872,878 ---- e->e_flags |= EF_QUEUERUN|EF_GLOBALERRS; e->e_errormode = EM_MAIL; e->e_id = id; ! GrabTo = UseErrorsTo = FALSE; if (forkflag) { disconnect(1, e); *** src/readcf.c.OLD Sun Oct 31 10:53:41 1993 --- src/readcf.c Sun Oct 31 11:29:49 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)readcf.c 8.13 (Berkeley) 10/15/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)readcf.c 8.14 (Berkeley) 10/31/93"; #endif /* not lint */ # include "sendmail.h" *************** *** 1093,1101 **** case 'a': /* look N minutes for "@:@" in alias file */ if (val[0] == '\0') ! SafeAlias = 5; else ! SafeAlias = atoi(val); break; case 'B': /* substitution for blank character */ --- 1093,1101 ---- case 'a': /* look N minutes for "@:@" in alias file */ if (val[0] == '\0') ! SafeAlias = 5 * 60; /* five minutes */ else ! SafeAlias = convtime(val, 'm'); break; case 'B': /* substitution for blank character */ *** src/recipient.c.OLD Mon Oct 25 20:15:14 1993 --- src/recipient.c Fri Oct 29 19:24:46 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)recipient.c 8.19 (Berkeley) 9/29/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)recipient.c 8.21 (Berkeley) 10/29/93"; #endif /* not lint */ # include "sendmail.h" *************** *** 222,229 **** stripquotes(buf); /* check for direct mailing to restricted mailers */ ! if (a->q_alias == NULL && m == ProgMailer && ! !bitset(EF_QUEUERUN, e->e_flags)) { a->q_flags |= QBADADDR; usrerr("550 Cannot mail directly to programs"); --- 222,228 ---- stripquotes(buf); /* check for direct mailing to restricted mailers */ ! if (a->q_alias == NULL && m == ProgMailer) { a->q_flags |= QBADADDR; usrerr("550 Cannot mail directly to programs"); *************** *** 276,282 **** if (m == InclMailer) { a->q_flags |= QDONTSEND; ! if (a->q_alias == NULL && !bitset(EF_QUEUERUN, e->e_flags)) { a->q_flags |= QBADADDR; usrerr("550 Cannot mail directly to :include:s"); --- 275,281 ---- if (m == InclMailer) { a->q_flags |= QDONTSEND; ! if (a->q_alias == NULL) { a->q_flags |= QBADADDR; usrerr("550 Cannot mail directly to :include:s"); *************** *** 313,319 **** p = strrchr(buf, '/'); /* check if writable or creatable */ ! if (a->q_alias == NULL && !bitset(EF_QUEUERUN, e->e_flags)) { a->q_flags |= QBADADDR; usrerr("550 Cannot mail directly to files"); --- 312,318 ---- p = strrchr(buf, '/'); /* check if writable or creatable */ ! if (a->q_alias == NULL) { a->q_flags |= QBADADDR; usrerr("550 Cannot mail directly to files"); *************** *** 322,328 **** (*p = '\0', safefile(buf, RealUid, RealGid, NULL, TRUE, S_IWRITE|S_IEXEC) != 0)) { a->q_flags |= QBADADDR; ! giveresponse(EX_CANTCREAT, m, NULL, e); } } --- 321,327 ---- (*p = '\0', safefile(buf, RealUid, RealGid, NULL, TRUE, S_IWRITE|S_IEXEC) != 0)) { a->q_flags |= QBADADDR; ! giveresponse(EX_CANTCREAT, m, NULL, a->q_alias, e); } } *************** *** 400,406 **** if (pw == NULL) { a->q_flags |= QBADADDR; ! giveresponse(EX_NOUSER, m, NULL, e); } else { --- 399,405 ---- if (pw == NULL) { a->q_flags |= QBADADDR; ! giveresponse(EX_NOUSER, m, NULL, a->q_alias, e); } else { *** src/savemail.c.OLD Sun Oct 31 08:19:50 1993 --- src/savemail.c Sun Oct 31 10:18:15 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)savemail.c 8.16 (Berkeley) 10/21/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)savemail.c 8.17 (Berkeley) 10/31/93"; #endif /* not lint */ # include "sendmail.h" *************** *** 267,273 **** e->e_flags |= EF_PM_NOTIFY; ! q = e->e_errorqueue; if (q == NULL) { /* this is an error-error */ --- 267,276 ---- e->e_flags |= EF_PM_NOTIFY; ! /* check to see if there are any good addresses */ ! for (q = e->e_errorqueue; q != NULL; q = q->q_next) ! if (!bitset(QBADADDR|QDONTSEND, q->q_flags)) ! break; if (q == NULL) { /* this is an error-error */ *** src/sendmail.h.OLD Sun Oct 24 13:49:09 1993 --- src/sendmail.h Sun Oct 31 11:22:57 1993 *************** *** 31,37 **** * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)sendmail.h 8.24 (Berkeley) 10/15/93 */ /* --- 31,37 ---- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)sendmail.h 8.26 (Berkeley) 10/31/93 */ /* *************** *** 41,47 **** # ifdef _DEFINE # define EXTERN # ifndef lint ! static char SmailSccsId[] = "@(#)sendmail.h 8.24 10/15/93"; # endif # else /* _DEFINE */ # define EXTERN extern --- 41,47 ---- # ifdef _DEFINE # define EXTERN # ifndef lint ! static char SmailSccsId[] = "@(#)sendmail.h 8.26 10/31/93"; # endif # else /* _DEFINE */ # define EXTERN extern *************** *** 57,62 **** --- 57,63 ---- # include # include # include + # include # include "conf.h" # include "useful.h" *************** *** 729,734 **** --- 730,736 ---- union bigsockaddr { struct sockaddr sa; /* general version */ + struct sockaddr_un sunix; /* UNIX family */ #ifdef NETINET struct sockaddr_in sin; /* INET family */ #endif *************** *** 765,771 **** EXTERN bool NoAlias; /* suppress aliasing */ EXTERN bool UseNameServer; /* use internet domain name server */ EXTERN bool SevenBit; /* force 7-bit data */ ! EXTERN int SafeAlias; /* minutes to wait until @:@ in alias file */ EXTERN FILE *InChannel; /* input connection */ EXTERN FILE *OutChannel; /* output connection */ EXTERN uid_t RealUid; /* when Daemon, real uid of caller */ --- 767,773 ---- EXTERN bool NoAlias; /* suppress aliasing */ EXTERN bool UseNameServer; /* use internet domain name server */ EXTERN bool SevenBit; /* force 7-bit data */ ! EXTERN time_t SafeAlias; /* interval to wait until @:@ in alias file */ EXTERN FILE *InChannel; /* input connection */ EXTERN FILE *OutChannel; /* output connection */ EXTERN uid_t RealUid; /* when Daemon, real uid of caller */ *** src/srvrsmtp.c.OLD Thu Oct 28 17:51:54 1993 --- src/srvrsmtp.c Thu Oct 28 19:38:21 1993 *************** *** 36,44 **** #ifndef lint #ifdef SMTP ! static char sccsid[] = "@(#)srvrsmtp.c 8.17 (Berkeley) 10/15/93 (with SMTP)"; #else ! static char sccsid[] = "@(#)srvrsmtp.c 8.17 (Berkeley) 10/15/93 (without SMTP)"; #endif #endif /* not lint */ --- 36,44 ---- #ifndef lint #ifdef SMTP ! static char sccsid[] = "@(#)srvrsmtp.c 8.18 (Berkeley) 10/28/93 (with SMTP)"; #else ! static char sccsid[] = "@(#)srvrsmtp.c 8.18 (Berkeley) 10/28/93 (without SMTP)"; #endif #endif /* not lint */ *************** *** 531,538 **** /* collect the text of the message */ SmtpPhase = "collect"; - HoldErrs = TRUE; collect(TRUE, doublequeue, e); /* ** Arrange to send to everyone. --- 531,540 ---- /* collect the text of the message */ SmtpPhase = "collect"; collect(TRUE, doublequeue, e); + if (Errors != 0) + goto abortmessage; + HoldErrs = TRUE; /* ** Arrange to send to everyone. *** src/util.c.OLD Sun Oct 31 13:03:51 1993 --- src/util.c Sun Oct 31 13:05:26 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)util.c 8.14 (Berkeley) 10/23/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)util.c 8.15 (Berkeley) 10/31/93"; #endif /* not lint */ # include "sendmail.h" *************** *** 1241,1246 **** --- 1241,1247 ---- p += strlen(p); switch (st.st_mode & S_IFMT) { + #ifdef S_IFSOCK case S_IFSOCK: sprintf(p, "SOCK "); p += strlen(p); *************** *** 1266,1271 **** --- 1267,1273 ---- : hp->h_name, ntohs(sin.sin_port)); } break; + #endif case S_IFCHR: sprintf(p, "CHR: "); *** src/version.c.OLD Sun Oct 31 13:09:46 1993 --- src/version.c Sun Oct 31 11:34:48 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)version.c 8.6.1.3 (Berkeley) 10/24/93"; #endif /* not lint */ ! char Version[] = "8.6.3"; --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)version.c 8.6.1.4 (Berkeley) 10/31/93"; #endif /* not lint */ ! char Version[] = "8.6.4"; *** cf/README.OLD Sun Oct 31 07:17:52 1993 --- cf/README Sun Oct 31 11:35:24 1993 *************** *** 4,10 **** Eric Allman ! @(#)README 8.14 (Berkeley) 9/19/93 This document describes the sendmail configuration files being used --- 4,10 ---- Eric Allman ! @(#)README 8.15 (Berkeley) 10/31/93 This document describes the sendmail configuration files being used *************** *** 1004,1009 **** --- 1004,1015 ---- 5 * Local address rewrite (after aliasing) 1x mailer rules (sender qualification) 2x mailer rules (recipient qualification) + 3x mailer rules (sender header qualification) + 4x mailer rules (recipient header qualification) + 5x mailer subroutines (general) + 6x mailer subroutines (general) + 7x mailer subroutines (general) + 8x reserved 90 Mailertable host stripping 96 Bottom half of Ruleset 3 (ruleset 6 in old sendmail) 97 Hook for recursive ruleset 0 call (ruleset 7 in old sendmail) *** cf/m4/proto.m4.OLD Sun Oct 31 07:23:08 1993 --- cf/m4/proto.m4 Sun Oct 31 11:35:58 1993 *************** *** 34,40 **** # divert(0) ! VERSIONID(`@(#)proto.m4 8.19 (Berkeley) 10/15/93') MAILER(local)dnl --- 34,40 ---- # divert(0) ! VERSIONID(`@(#)proto.m4 8.20 (Berkeley) 10/31/93') MAILER(local)dnl *************** *** 393,401 **** ########################################### S3 ! # handle null input and list syntax (translate to <@> special case) R$@ $@ <@> - R$*:;$* $@ $1 :; <@> # basic textual canonicalization -- note RFC733 heuristic here R$*<$*>$*<$*>$* $2$3<$4>$5 strip multiple <> <> --- 393,400 ---- ########################################### S3 ! # handle null input (translate to <@> special case) R$@ $@ <@> # basic textual canonicalization -- note RFC733 heuristic here R$*<$*>$*<$*>$* $2$3<$4>$5 strip multiple <> <> *************** *** 402,407 **** --- 401,409 ---- R$*<$*<$+>$*>$* <$3>$5 2-level <> nesting R$*<>$* $@ <@> MAIL FROM:<> case R$*<$+>$* $2 basic RFC821/822 parsing + + # handle list:; syntax as special case + R$*:;$* $@ $1 :; <@> # make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later R@ $+ , $+ @ $1 : $2 change all "," to ":" *** cf/m4/version.m4.OLD Sun Oct 31 12:35:27 1993 --- cf/m4/version.m4 Sun Oct 31 12:35:42 1993 *************** *** 32,39 **** # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ! VERSIONID(`@(#)version.m4 8.6.1.3 (Berkeley) 10/24/93') # divert(0) # Configuration version number ! DZ8.6.3 --- 32,39 ---- # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ! VERSIONID(`@(#)version.m4 8.6.1.4 (Berkeley) 10/31/93') # divert(0) # Configuration version number ! DZ8.6.4 *** cf/mailer/local.m4.OLD Sun Oct 24 14:57:03 1993 --- cf/mailer/local.m4 Sun Oct 24 16:27:18 1993 *************** *** 44,54 **** ### Local and Program Mailer specification ### ################################################## ! VERSIONID(`@(#)local.m4 8.5 (Berkeley) 10/23/93') Mlocal, P=LOCAL_MAILER_PATH, F=CONCAT(`lsDFM', LOCAL_MAILER_FLAGS), S=10, R=20/40, A=LOCAL_MAILER_ARGS ! Mprog, P=LOCAL_SHELL_PATH, F=CONCAT(`lsDFM', LOCAL_SHELL_FLAGS), S=10, R=20, D=$z:/, A=LOCAL_SHELL_ARGS S10 --- 44,54 ---- ### Local and Program Mailer specification ### ################################################## ! VERSIONID(`@(#)local.m4 8.6 (Berkeley) 10/24/93') Mlocal, P=LOCAL_MAILER_PATH, F=CONCAT(`lsDFM', LOCAL_MAILER_FLAGS), S=10, R=20/40, A=LOCAL_MAILER_ARGS ! Mprog, P=LOCAL_SHELL_PATH, F=CONCAT(`lsDFM', LOCAL_SHELL_FLAGS), S=10, R=20/40, D=$z:/, A=LOCAL_SHELL_ARGS S10 *** cf/mailer/smtp.m4.OLD Sun Oct 31 07:19:59 1993 --- cf/mailer/smtp.m4 Sun Oct 31 11:38:08 1993 *************** *** 40,52 **** ### SMTP Mailer specification ### ##################################### ! VERSIONID(`@(#)smtp.m4 8.6 (Berkeley) 10/23/93') Msmtp, P=[IPC], F=CONCAT(mDFMuX, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), E=\r\n, ifdef(`_OLD_SENDMAIL_',, `L=990, ')A=IPC $h Mesmtp, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), E=\r\n, ifdef(`_OLD_SENDMAIL_',, `L=990, ')A=IPC $h ! Mrelay, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=19, E=\r\n, ifdef(`_OLD_SENDMAIL_',, `L=2040, ')A=IPC $h # --- 40,52 ---- ### SMTP Mailer specification ### ##################################### ! VERSIONID(`@(#)smtp.m4 8.7 (Berkeley) 10/31/93') Msmtp, P=[IPC], F=CONCAT(mDFMuX, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), E=\r\n, ifdef(`_OLD_SENDMAIL_',, `L=990, ')A=IPC $h Mesmtp, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), E=\r\n, ifdef(`_OLD_SENDMAIL_',, `L=990, ')A=IPC $h ! Mrelay, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=51, E=\r\n, ifdef(`_OLD_SENDMAIL_',, `L=2040, ')A=IPC $h # *************** *** 53,64 **** # envelope sender and masquerading recipient rewriting # S11 ! R$+ $: $>19 $1 sender/recipient common R$* :; <@> $@ $1 :; list:; special case # handle unqualified names R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified ! R$* $@ $>29 $1 # --- 53,64 ---- # envelope sender and masquerading recipient rewriting # S11 ! R$+ $: $>51 $1 sender/recipient common R$* :; <@> $@ $1 :; list:; special case # handle unqualified names R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified ! R$* $@ $>61 $1 # *************** *** 67,73 **** S21 # do sender/recipient common rewriting ! R$+ $: $>19 $1 # unqualified names (e.g., "eric") are qualified by local host R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified --- 67,73 ---- S21 # do sender/recipient common rewriting ! R$+ $: $>51 $1 # unqualified names (e.g., "eric") are qualified by local host R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified *************** *** 78,84 **** # header sender and masquerading recipient rewriting # S31 ! R$+ $: $>19 $1 sender/recipient common R$* :; <@> $@ $1 :; list:; special case # do special header rewriting --- 78,84 ---- # header sender and masquerading recipient rewriting # S31 ! R$+ $: $>51 $1 sender/recipient common R$* :; <@> $@ $1 :; list:; special case # do special header rewriting *************** *** 90,102 **** # handle unqualified names R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified ! R$* $@ $>29 $1 # # common rewriting for all SMTP addresses # ! S19 # pass s through R< @ $+ > $* $@ < @ $1 > $2 resolve --- 90,102 ---- # handle unqualified names R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified ! R$* $@ $>61 $1 # # common rewriting for all SMTP addresses # ! S51 # pass s through R< @ $+ > $* $@ < @ $1 > $2 resolve *************** *** 117,123 **** # # common sender and masquerading recipient rewriting # ! S29 R$=E $@ $1 < @ $j> show exposed names R$+ $: $1 < @ $M > user w/o host R$+ <@> $: $1 < @ $j > in case $M undefined --- 117,124 ---- # # common sender and masquerading recipient rewriting # ! S61 ! R$=E $@ $1 < @ $j> show exposed names R$+ $: $1 < @ $M > user w/o host R$+ <@> $: $1 < @ $j > in case $M undefined *** cf/mailer/uucp.m4.OLD Sun Oct 31 07:04:26 1993 --- cf/mailer/uucp.m4 Sun Oct 31 11:38:35 1993 *************** *** 42,48 **** ### UUCP Mailer specification ### ##################################### ! VERSIONID(`@(#)uucp.m4 8.5 (Berkeley) 7/28/93') # old UUCP mailer Muucp, P=UUCP_MAILER_PATH, F=CONCAT(DFMhuU, UUCP_MAILER_FLAGS), S=12, R=22, M=UUCP_MAX_SIZE, --- 42,48 ---- ### UUCP Mailer specification ### ##################################### ! VERSIONID(`@(#)uucp.m4 8.6 (Berkeley) 10/31/93') # old UUCP mailer Muucp, P=UUCP_MAILER_PATH, F=CONCAT(DFMhuU, UUCP_MAILER_FLAGS), S=12, R=22, M=UUCP_MAX_SIZE, *************** *** 54,64 **** ifdef(`_MAILER_smtp_', `# domain-ized UUCP mailer ! Muucp-dom, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhu, UUCP_MAILER_FLAGS), S=11, R=21, M=UUCP_MAX_SIZE, A=UUCP_MAILER_ARGS') ! # sender rewriting S12 # handle error address as a special case --- 54,66 ---- ifdef(`_MAILER_smtp_', `# domain-ized UUCP mailer ! Muucp-dom, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhu, UUCP_MAILER_FLAGS), S=52/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), M=UUCP_MAX_SIZE, A=UUCP_MAILER_ARGS') ! # ! # envelope and header sender rewriting ! # S12 # handle error address as a special case *************** *** 73,79 **** R$* < @ $+ > $2 ! $1 convert to UUCP format R$+ $: $U ! $1 prepend our name ! # recipient rewriting S22 # don't touch list:; syntax --- 75,83 ---- R$* < @ $+ > $2 ! $1 convert to UUCP format R$+ $: $U ! $1 prepend our name ! # ! # envelope and header recipient rewriting ! # S22 # don't touch list:; syntax *************** *** 83,88 **** --- 87,105 ---- R$* < @ $j > $1 strip local name R$* < @ $- . UUCP > $2 ! $1 convert to UUCP format R$* < @ $+ > $2 ! $1 convert to UUCP format + + + # + # envelope sender rewriting for uucp-dom mailer + # + S52 + + # handle error address as a special case + R<@> $n errors to mailer-daemon + + # pass everything to standard SMTP mailer rewriting + R$* $@ $>11 $1 + PUSHDIVERT(4) # resolve locally connected UUCP links