diff options
author | peter <peter@FreeBSD.org> | 1997-08-04 05:06:42 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1997-08-04 05:06:42 +0000 |
commit | 5a27937fcdd3e822dbb6634b110749d5db655fda (patch) | |
tree | 313ffb39dad3c04a6f3e05cff8aab358c802a22a /usr.sbin | |
parent | 8f01114fd6a20cb3eb0bebf1407ee2c4d1a81164 (diff) | |
download | FreeBSD-src-5a27937fcdd3e822dbb6634b110749d5db655fda.zip FreeBSD-src-5a27937fcdd3e822dbb6634b110749d5db655fda.tar.gz |
Merge sendmail 8.8.7 changes from vendor branch
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/sendmail/src/collect.c | 7 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/conf.c | 55 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/conf.h | 169 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/daemon.c | 109 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/deliver.c | 20 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/domain.c | 9 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/headers.c | 5 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/main.c | 160 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/parseaddr.c | 38 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/readcf.c | 65 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/savemail.c | 31 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/sendmail.h | 31 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/srvrsmtp.c | 177 | ||||
-rw-r--r-- | usr.sbin/sendmail/src/util.c | 42 |
14 files changed, 626 insertions, 292 deletions
diff --git a/usr.sbin/sendmail/src/collect.c b/usr.sbin/sendmail/src/collect.c index 219a47f..de4ee06 100644 --- a/usr.sbin/sendmail/src/collect.c +++ b/usr.sbin/sendmail/src/collect.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)collect.c 8.69 (Berkeley) 5/29/97"; +static char sccsid[] = "@(#)collect.c 8.71 (Berkeley) 6/30/97"; #endif /* not lint */ # include <errno.h> @@ -427,7 +427,8 @@ readerr: return; if (tf != NULL && - (fflush(tf) != 0 || ferror(tf) || fsync(fileno(tf)) < 0 || + (fflush(tf) != 0 || ferror(tf) || + (SuperSafe && fsync(fileno(tf)) < 0) || fclose(tf) < 0)) { tferror(tf, e); @@ -541,7 +542,7 @@ readerr: break; case NRA_ADD_BCC: - addheader("Bcc", "", &e->e_header); + addheader("Bcc", " ", &e->e_header); break; case NRA_ADD_TO_UNDISCLOSED: diff --git a/usr.sbin/sendmail/src/conf.c b/usr.sbin/sendmail/src/conf.c index 0d50508..60502b3 100644 --- a/usr.sbin/sendmail/src/conf.c +++ b/usr.sbin/sendmail/src/conf.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)conf.c 8.362 (Berkeley) 6/14/97"; +static char sccsid[] = "@(#)conf.c 8.374 (Berkeley) 8/2/97"; #endif /* not lint */ # include "sendmail.h" @@ -177,6 +177,10 @@ int DtableSize = 50; /* max open files; reset in 4.2bsd */ #define HOURS * 60 MINUTES #define DAYS * 24 HOURS +#ifndef _PATH_VARTMP +# define _PATH_VARTMP "/usr/tmp/" +#endif + #ifndef MAXRULERECURSION # define MAXRULERECURSION 50 /* max ruleset recursion depth */ #endif @@ -186,6 +190,7 @@ setdefaults(e) register ENVELOPE *e; { int i; + char buf[MAXNAME]; extern void inittimeouts(); extern void setdefuser(); extern void setupmaps(); @@ -233,7 +238,12 @@ setdefaults(e) MaxAliasRecursion = 10; MaxMacroRecursion = 10; ColonOkInAddr = TRUE; + DontLockReadFiles = TRUE; DoubleBounceAddr = "postmaster"; + snprintf(buf, sizeof buf, "%s%sdead.letter", + _PATH_VARTMP, + _PATH_VARTMP[sizeof _PATH_VARTMP - 2] == '/' ? "" : "/"); + DeadLetterDrop = newstr(buf); setdefuser(); setupmaps(); setupmailers(); @@ -412,6 +422,13 @@ setupmaps() MAPDEF("null", NULL, MCF_ALIASOK|MCF_OPTFILE, map_parseargs, null_map_open, null_map_close, null_map_lookup, null_map_store); + +#if _FFR_SYSLOG_MAP + /* syslog map -- logs information to syslog */ + MAPDEF("syslog", NULL, 0, + syslog_map_parseargs, null_map_open, null_map_close, + syslog_map_lookup, null_map_store); +#endif } #undef MAPDEF @@ -3822,8 +3839,8 @@ chownsafe(fd, safedir) int fd; bool safedir; { -#if !defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1 -# if defined(_PC_CHOWN_RESTRICTED) +#if (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && \ + defined(_PC_CHOWN_RESTRICTED) int rval; /* give the system administrator a chance to override */ @@ -3838,11 +3855,10 @@ chownsafe(fd, safedir) errno = 0; rval = fpathconf(fd, _PC_CHOWN_RESTRICTED); -# if SAFENFSPATHCONF +# if SAFENFSPATHCONF return errno == 0 && rval IS_SAFE_CHOWN; -# else +# else return safedir && errno == 0 && rval IS_SAFE_CHOWN; -# endif # endif #else return ChownAlwaysSafe; @@ -3981,7 +3997,7 @@ vendor_pre_defaults(e) /* OTHERUID is defined in shares.h, do not be alarmed */ DefShareUid = OTHERUID; #endif -#ifdef SUN_EXTENSIONS +#if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) sun_pre_defaults(e); #endif #ifdef apollo @@ -3996,7 +4012,7 @@ void vendor_post_defaults(e) ENVELOPE *e; { -#ifdef SUN_EXTENSIONS +#if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) sun_post_defaults(e); #endif } @@ -4076,12 +4092,22 @@ validate_connection(sap, hostname, e) char *hostname; ENVELOPE *e; { + if (tTd(48, 3)) + printf("validate_connection(%s, %s)\n", + hostname, anynet_ntoa(sap)); + if (rscheck("check_relay", hostname, anynet_ntoa(sap), e) != EX_OK) + { + if (tTd(48, 4)) + printf(" ... validate_connection: BAD (rscheck)\n"); return FALSE; + } #if TCPWRAPPERS if (!hosts_ctl("sendmail", hostname, anynet_ntoa(sap), STRING_UNKNOWN)) { + if (tTd(48, 4)) + printf(" ... validate_connection: BAD (tcpwrappers)\n"); if (LogLevel >= 4) sm_syslog(LOG_NOTICE, NOQID, "tcpwrappers (%s, %s) rejection", @@ -4089,6 +4115,8 @@ validate_connection(sap, hostname, e) return FALSE; } #endif + if (tTd(48, 4)) + printf(" ... validate_connection: OK\n"); return TRUE; } @@ -4462,7 +4490,7 @@ load_if_names() return; /* get the list of known IP address from the kernel */ -# ifdef SIOCGIFNUM +# if defined(SIOCGIFNUM) && !SIOCGIFNUM_IS_BROKEN if (ioctl(s, SIOCGIFNUM, (char *) &numifs) < 0) { /* can't get number of interfaces -- fall back */ @@ -4967,6 +4995,9 @@ char *OsCompileOptions[] = #if HASSNPRINTF "HASSNPRINTF", #endif +#if HAS_ST_GEN + "HAS_ST_GEN", +#endif #if HASSTRERROR "HASSTRERROR", #endif @@ -4988,6 +5019,9 @@ char *OsCompileOptions[] = #if IP_SRCROUTE "IP_SRCROUTE", #endif +#if O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL + "LOCK_ON_OPEN", +#endif #if NEEDFSYNC "NEEDFSYNC", #endif @@ -5009,6 +5043,9 @@ char *OsCompileOptions[] = #if SIOCGIFCONF_IS_BROKEN "SIOCGIFCONF_IS_BROKEN", #endif +#if SIOCGIFNUM_IS_BROKEN + "SIOCGIFNUM_IS_BROKEN", +#endif #if SYS5SETPGRP "SYS5SETPGRP", #endif diff --git a/usr.sbin/sendmail/src/conf.h b/usr.sbin/sendmail/src/conf.h index 745b7a0..2da4506 100644 --- a/usr.sbin/sendmail/src/conf.h +++ b/usr.sbin/sendmail/src/conf.h @@ -31,7 +31,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)conf.h 8.313 (Berkeley) 6/11/97 + * @(#)conf.h 8.328 (Berkeley) 8/3/97 */ /* @@ -192,7 +192,9 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */ # ifdef V4FS /* HP-UX 10.x */ # define _PATH_UNIX "/stand/vmunix" -# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" # endif @@ -203,13 +205,16 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */ # else /* HP-UX 9.x */ # define _PATH_UNIX "/hp-ux" -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef IDENTPROTO # define IDENTPROTO 0 /* TCP/IP implementation is broken */ # endif # ifdef __STDC__ extern void hard_syslog(int, char *, ...); # endif +# define FDSET_CAST (int *) /* cast for fd_set parameters to select */ # endif #endif @@ -220,10 +225,11 @@ extern void hard_syslog(int, char *, ...); */ #ifdef _AIX4 -# include <sys/select.h> # define _AIX3 1 /* pull in AIX3 stuff */ # define USESETEUID 1 /* seteuid(2) works */ # define TZ_TYPE TZ_NAME /* use tzname[] vector */ +# define SOCKADDR_LEN_T size_t /* e.g., arg#3 to accept, getsockname */ +# define SOCKOPT_LEN_T size_t /* arg#5 to getsockopt */ # if _AIX4 >= 40200 # define HASSETREUID 1 /* setreuid(2) works as of AIX 4.2 */ # endif @@ -237,6 +243,7 @@ extern void hard_syslog(int, char *, ...); #ifdef _AIX3 # include <paths.h> # include <sys/machine.h> /* to get byte order */ +# include <sys/select.h> # define HASINITGROUPS 1 /* has initgroups(3) call */ # define HASUNAME 1 /* use System V uname(2) system call */ # define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ @@ -398,7 +405,9 @@ typedef int pid_t; # ifndef _PATH_UNIX # define _PATH_UNIX "/dev/ksyms" # endif -# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" # endif @@ -435,6 +444,7 @@ typedef int pid_t; # endif # define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ # define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone */ +# include <memory.h> # include <vfork.h> # ifdef SUNOS403 @@ -585,12 +595,15 @@ extern long dgux_inet_addr(); # define HASINITGROUPS 1 /* has initgroups(3) call */ # define HASFCHMOD 1 /* has fchmod(2) syscall */ # define IP_SRCROUTE 1 /* can check IP source routing */ +# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ # ifndef HASFLOCK # define HASFLOCK 1 /* has flock(2) call */ # endif # define LA_TYPE LA_ALPHAOSF # define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ -# define _PATH_VENDOR_CF "/var/adm/sendmail/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/var/adm/sendmail/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/var/run/sendmail.pid" # endif @@ -625,10 +638,20 @@ typedef int pid_t; # undef WEXITSTATUS # undef WIFEXITED # endif -# define _PATH_VENDOR_CF "/etc/sendmail/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/etc/sendmail/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail/sendmail.pid" # endif + +# ifdef TCPWRAPPERS +# ifndef HASUNSETENV +# define HASUNSETENV 1 +# endif +# undef NEEDPUTENV +# endif + #endif @@ -645,6 +668,7 @@ typedef int pid_t; # define HASFCHMOD 1 /* has fchmod(2) syscall */ # define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ # define HASSTRERROR 1 /* has strerror(3) */ +# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ # include <sys/cdefs.h> # define ERRLIST_PREDEFINED /* don't declare sys_errlist */ # define BSD4_4_SOCKADDR /* has sa_len */ @@ -671,6 +695,7 @@ typedef int pid_t; # define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ # define HASUNAME 1 /* has uname(2) syscall */ # define HASSTRERROR 1 /* has strerror(3) */ +# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ # include <sys/cdefs.h> # define ERRLIST_PREDEFINED /* don't declare sys_errlist */ # define BSD4_4_SOCKADDR /* has sa_len */ @@ -713,6 +738,7 @@ typedef int pid_t; # define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ # define HASUNAME 1 /* has uname(2) syscall */ # define HASSTRERROR 1 /* has strerror(3) */ +# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ # include <sys/cdefs.h> # define ERRLIST_PREDEFINED /* don't declare sys_errlist */ # define BSD4_4_SOCKADDR /* has sa_len */ @@ -776,7 +802,9 @@ typedef int pid_t; # undef HASSETVBUF /* don't actually have setvbuf(3) */ # undef WEXITSTATUS # undef WIFEXITED -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif @@ -844,7 +872,9 @@ typedef int pid_t; # ifndef LA_TYPE # define LA_TYPE LA_FLOAT # endif -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef IDENTPROTO # define IDENTPROTO 0 /* TCP/IP implementation is broken */ # endif @@ -888,6 +918,8 @@ extern int errno; # define LA_TYPE LA_DEVSHORT # endif # define _PATH_AVENRUN "/dev/table/avenrun" +# define SOCKADDR_LEN_T size_t /* e.g., arg#3 to accept, getsockname */ +# define SOCKOPT_LEN_T size_t /* arg#5 to getsockopt */ #endif /* SCO UNIX 3.2v4.2/Open Desktop 3.0 */ @@ -912,7 +944,9 @@ extern int errno; # define GID_T gid_t # define GIDSET_T gid_t # define _PATH_UNIX "/unix" -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif @@ -953,7 +987,9 @@ extern int errno; # define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ # define SFS_BAVAIL f_bfree /* alternate field name */ # define _PATH_UNIX "/unix" -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif @@ -1032,7 +1068,9 @@ extern struct group *getgrnam(); # define IP_SRCROUTE 0 /* Something is broken with getsockopt() */ # define LA_TYPE LA_FLOAT # define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef S_IREAD # define S_IREAD _S_IREAD # define S_IWRITE _S_IWRITE @@ -1088,13 +1126,22 @@ extern struct group *getgrnam(); extern int errno; typedef int pid_t; -#define SIGFUNC_DEFINED -#define SIGFUNC_RETURN (0) -#define SIGFUNC_DECL int +# define SIGFUNC_DEFINED +# define SIGFUNC_RETURN (0) +# define SIGFUNC_DECL int typedef int (*sigfunc_t)(); extern char *getenv(); extern void *malloc(); +/* added for RISC/os 4.01...which is dumber than 4.50 */ +# ifdef RISCOS_4_0 +# ifndef ARBPTR_T +# define ARBPTR_T char * +# endif +# undef HASFLOCK +# define HASFLOCK 0 +# endif /* RISCOS_4_0 */ + # include <sys/time.h> #endif @@ -1203,7 +1250,9 @@ extern void *malloc(); # ifndef _PATH_UNIX # define _PATH_UNIX "/unix" /* should be in <paths.h> */ # endif -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # undef WIFEXITED # undef WEXITSTATUS #endif @@ -1283,8 +1332,9 @@ typedef int pid_t; # ifndef _PATH_UNIX # define _PATH_UNIX "/dynix" # endif -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" - +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif #endif @@ -1312,7 +1362,9 @@ typedef int pid_t; # ifndef IDENTPROTO # define IDENTPROTO 0 /* TCP/IP implementation is broken */ # endif -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif @@ -1353,7 +1405,9 @@ typedef int pid_t; # define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ # define SFS_BAVAIL f_bfree /* alternate field name */ # define TZ_TYPE TZ_TZNAME -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif @@ -1377,6 +1431,7 @@ typedef int pid_t; #ifdef UNIXWARE2 # define UNIXWARE 1 # define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ +# undef offsetof /* avoid stddefs.h, sys/sysmacros.h conflict */ #endif @@ -1401,7 +1456,9 @@ typedef int pid_t; # undef WIFEXITED # undef WEXITSTATUS # define _PATH_UNIX "/unix" -# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/usr/ucblib/sendmail.pid" # endif @@ -1451,8 +1508,9 @@ typedef int pid_t; #ifdef NCR_MP_RAS3 # define __svr4__ +# define SIOCGIFNUM_IS_BROKEN 1 /* SIOCGIFNUM has non-std interface */ # define SYSLOG_BUFSIZE 1024 -# define SPT_TYPE SPT_NONE +# define SPT_TYPE SPT_NONE #endif @@ -1487,7 +1545,9 @@ typedef int pid_t; # ifndef _PATH_UNIX # define _PATH_UNIX "/HI-UX" # endif -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif # ifndef IDENTPROTO # define IDENTPROTO 0 /* TCP/IP implementation is broken */ # endif @@ -1528,7 +1588,9 @@ extern int syslog(int, char *, ...); # define SFS_TYPE SFS_4ARGS /* use 4-arg statfs() */ # define SFS_BAVAIL f_bfree /* alternate field name */ # define _PATH_UNIX "/unix" -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif #endif /* @@ -1598,7 +1660,9 @@ typedef int (*sigfunc_t)(); # define SYSLOG_BUFSIZE 1024 # endif # define _PATH_UNIX "/stand/unix" -# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" # endif @@ -1647,7 +1711,9 @@ typedef int (*sigfunc_t)(); # define SIGFUNC_DECL int extern char *getenv(); extern int errno; -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# endif #endif @@ -1696,7 +1762,9 @@ extern int errno; # define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ # endif # define _PATH_UNIX "/stand/unix" -# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/usr/ucblib/sendmail.pid" # endif @@ -1759,7 +1827,9 @@ extern int errno; # ifndef __svr4__ # define __svr4__ # endif -# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" # endif @@ -1954,6 +2024,10 @@ typedef struct msgb mblk_t; # define USE_SIGLONGJMP 0 /* assume setjmp handles signals properly */ #endif +#ifndef FDSET_CAST +# define FDSET_CAST /* (empty) cast for fd_set arg to select */ +#endif + /* ** If no type for argument two of getgroups call is defined, assume ** it's an integer -- unfortunately, there seem to be several choices @@ -1983,6 +2057,14 @@ typedef struct msgb mblk_t; #ifndef ARGV_T # define ARGV_T char ** #endif + +#ifndef SOCKADDR_LEN_T +# define SOCKADDR_LEN_T int +#endif + +#ifndef SOCKOPT_LEN_T +# define SOCKOPT_LEN_T int +#endif /********************************************************************** ** Remaining definitions should never have to be changed. They are ** primarily to provide back compatibility for older systems -- for @@ -2077,28 +2159,6 @@ extern int h_errno; #endif /* -** The size of an IP address -- can't use sizeof because of problems -** on Crays, where everything is 64 bits. This will break if/when -** IP addresses are expanded to eight bytes. -*/ - -#ifndef INADDRSZ -# define INADDRSZ 4 -#endif - -/* -** The size of various known types -- for reading network protocols. -** Again, we can't use sizeof because of compiler randomness. -*/ - -#ifndef INT16SZ -# define INT16SZ 2 -#endif -#ifndef INT32SZ -# define INT32SZ 4 -#endif - -/* ** Do some required dependencies */ @@ -2256,12 +2316,17 @@ typedef void (*sigfunc_t) __P((int)); */ #if USE_SIGLONGJMP -/* Silly SCO /usr/include/setjmp.h file has #define setjmp(env) setjmp(env) */ +# ifdef jmp_buf +# undef jmp_buf +# endif +# define jmp_buf sigjmp_buf # ifdef setjmp # undef setjmp # endif -# define jmp_buf sigjmp_buf # define setjmp(env) sigsetjmp(env, 1) +# ifdef longjmp +# undef longjmp +# endif # define longjmp(env, val) siglongjmp(env, val) #endif diff --git a/usr.sbin/sendmail/src/daemon.c b/usr.sbin/sendmail/src/daemon.c index 41f1a72..bc8fd6f 100644 --- a/usr.sbin/sendmail/src/daemon.c +++ b/usr.sbin/sendmail/src/daemon.c @@ -37,9 +37,9 @@ #ifndef lint #ifdef DAEMON -static char sccsid[] = "@(#)daemon.c 8.175 (Berkeley) 6/1/97 (with daemon mode)"; +static char sccsid[] = "@(#)daemon.c 8.186 (Berkeley) 8/2/97 (with daemon mode)"; #else -static char sccsid[] = "@(#)daemon.c 8.175 (Berkeley) 6/1/97 (without daemon mode)"; +static char sccsid[] = "@(#)daemon.c 8.186 (Berkeley) 8/2/97 (without daemon mode)"; #endif #endif /* not lint */ @@ -130,6 +130,7 @@ getrequests(e) bool refusingconnections = TRUE; FILE *pidf; int socksize; + u_short port; #if XDEBUG bool j_has_dot; #endif @@ -140,11 +141,24 @@ getrequests(e) ** Set up the address for the mailer. */ - if (DaemonAddr.sin.sin_family == 0) - DaemonAddr.sin.sin_family = AF_INET; - if (DaemonAddr.sin.sin_addr.s_addr == 0) - DaemonAddr.sin.sin_addr.s_addr = INADDR_ANY; - if (DaemonAddr.sin.sin_port == 0) + switch (DaemonAddr.sa.sa_family) + { + case AF_UNSPEC: + DaemonAddr.sa.sa_family = AF_INET; + /* fall through ... */ + + case AF_INET: + if (DaemonAddr.sin.sin_addr.s_addr == 0) + DaemonAddr.sin.sin_addr.s_addr = INADDR_ANY; + port = DaemonAddr.sin.sin_port; + break; + + default: + /* unknown protocol */ + port = 0; + break; + } + if (port == 0) { register struct servent *sp; @@ -152,10 +166,21 @@ getrequests(e) if (sp == NULL) { syserr("554 service \"smtp\" unknown"); - DaemonAddr.sin.sin_port = htons(25); + port = htons(25); } else - DaemonAddr.sin.sin_port = sp->s_port; + port = sp->s_port; + } + + switch (DaemonAddr.sa.sa_family) + { + case AF_INET: + DaemonAddr.sin.sin_port = port; + break; + + default: + /* unknown protocol */ + break; } /* @@ -171,7 +196,7 @@ getrequests(e) (void) setsignal(SIGCHLD, reapchild); /* write the pid to the log file for posterity */ - pidf = safefopen(PidFile, O_WRONLY|O_CREAT|O_TRUNC, 0644, + pidf = safefopen(PidFile, O_WRONLY|O_TRUNC, 0644, SFF_NOLINK|SFF_ROOTOK|SFF_REGONLY|SFF_CREAT); if (pidf == NULL) { @@ -206,7 +231,7 @@ getrequests(e) for (;;) { register pid_t pid; - auto int lotherend; + auto SOCKADDR_LEN_T lotherend; int savederrno; int pipefd[2]; extern bool refuseconnections(); @@ -281,7 +306,8 @@ getrequests(e) timeout.tv_sec = 60; timeout.tv_usec = 0; - t = select(DaemonSocket + 1, &readfds, NULL, NULL, &timeout); + t = select(DaemonSocket + 1, FDSET_CAST &readfds, + NULL, NULL, &timeout); if (DoQueueRun) (void) runqueue(TRUE, FALSE); if (t <= 0 || !FD_ISSET(DaemonSocket, &readfds)) @@ -972,7 +998,7 @@ gothostent: } else { - s = socket(AF_INET, SOCK_STREAM, 0); + s = socket(addr.sa.sa_family, SOCK_STREAM, 0); } if (s < 0) { @@ -1176,6 +1202,35 @@ myhostname(hostbuf, size) return (hp); } /* +** ADDRCMP -- compare two host addresses +** +** Parameters: +** hp -- hostent structure for the first address +** ha -- actual first address +** sa -- second address +** +** Returns: +** 0 -- if ha and sa match +** else -- they don't match +*/ + +int +addrcmp(hp, ha, sa) + struct hostent *hp; + char *ha; + SOCKADDR *sa; +{ + switch (sa->sa.sa_family) + { + case AF_INET: + if (hp->h_addrtype == AF_INET) + return bcmp(ha, (char *) &sa->sin.sin_addr, hp->h_length); + break; + + } + return -1; +} +/* ** GETAUTHINFO -- get the real host name asociated with a file descriptor ** ** Uses RFC1413 protocol to try to get info from the other end. @@ -1199,10 +1254,10 @@ char * getauthinfo(fd) int fd; { - int falen; + SOCKADDR_LEN_T falen; register char *volatile p = NULL; SOCKADDR la; - int lalen; + SOCKADDR_LEN_T lalen; register struct servent *sp; volatile int s; int i; @@ -1239,19 +1294,22 @@ getauthinfo(fd) /* address is not a socket */ may_be_forged = FALSE; } + else if (RealHostName[0] == '[') + { + /* have IP address with no forward lookup */ + may_be_forged = FALSE; + } else { /* try to match the reverse against the forward lookup */ - hp = gethostbyname(RealHostName); + hp = sm_gethostbyname(RealHostName); if (hp == NULL) may_be_forged = TRUE; else { for (ha = hp->h_addr_list; *ha != NULL; ha++) - if (bcmp(*ha, - (char *) &RealHostAddr.sin.sin_addr, - hp->h_length) == 0) + if (addrcmp(hp, *ha, &RealHostAddr) == 0) break; may_be_forged = *ha == NULL; } @@ -1412,7 +1470,8 @@ postident: if (RealHostAddr.sa.sa_family == AF_INET) { - int ipoptlen, j; + SOCKOPT_LEN_T ipoptlen; + int j; u_char *q; u_char *o; int l; @@ -1573,6 +1632,14 @@ host_map_lookup(map, name, av, statp) } if (*statp != EX_OK) return NULL; + if (s->s_namecanon.nc_cname == NULL) + { + syserr("host_map_lookup(%s): bogus NULL cache entry, errno = %d, h_errno = %d", + name, + s->s_namecanon.nc_errno, + s->s_namecanon.nc_herrno); + return NULL; + } if (bitset(MF_MATCHONLY, map->map_mflags)) cp = map_rewrite(map, name, strlen(name), NULL); else @@ -1959,7 +2026,7 @@ hostnamebyanyaddr(sap) _res.retry = saveretry; #endif /* NAMED_BIND */ - if (hp != NULL) + if (hp != NULL && hp->h_name[0] != '[') return (char *) hp->h_name; else { diff --git a/usr.sbin/sendmail/src/deliver.c b/usr.sbin/sendmail/src/deliver.c index b5d5413..8805ab9 100644 --- a/usr.sbin/sendmail/src/deliver.c +++ b/usr.sbin/sendmail/src/deliver.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)deliver.c 8.282 (Berkeley) 6/11/97"; +static char sccsid[] = "@(#)deliver.c 8.285 (Berkeley) 8/2/97"; #endif /* not lint */ #include "sendmail.h" @@ -543,7 +543,7 @@ sendall(e, mode) } /* be sure to give error messages in child */ - QuickAbort = OnlyOneError = FALSE; + QuickAbort = FALSE; /* ** Close any cached connections. @@ -3105,7 +3105,7 @@ mailfile(filename, ctladdr, sfflags, e) { register FILE *f; register pid_t pid = -1; - int mode; + int mode = ST_MODE_NOFILE; bool suidwarn = geteuid() == 0; if (tTd(11, 1)) @@ -3153,19 +3153,20 @@ mailfile(filename, ctladdr, sfflags, e) ExitStat = EX_OK; #ifdef HASLSTAT - if ((SafeFileEnv != NULL ? lstat(filename, &stb) - : stat(filename, &stb)) < 0) + if (lstat(filename, &stb) < 0) #else if (stat(filename, &stb) < 0) #endif { - stb.st_mode = FileMode; + stb.st_mode = ST_MODE_NOFILE; + mode = FileMode; oflags |= O_CREAT|O_EXCL; } else if (bitset(0111, stb.st_mode) || stb.st_nlink != 1 || (SafeFileEnv != NULL && !S_ISREG(stb.st_mode))) exit(EX_CANTCREAT); - mode = stb.st_mode; + if (mode == ST_MODE_NOFILE) + mode = stb.st_mode; /* limit the errors to those actually caused in the child */ errno = 0; @@ -3275,6 +3276,11 @@ mailfile(filename, ctladdr, sfflags, e) message("554 cannot open: %s", errstring(errno)); exit(EX_CANTCREAT); } + if (filechanged(filename, fileno(f), &stb, sfflags)) + { + message("554 file changed after open"); + exit(EX_CANTCREAT); + } if (fstat(fileno(f), &stb) < 0) { message("554 cannot fstat %s", errstring(errno)); diff --git a/usr.sbin/sendmail/src/domain.c b/usr.sbin/sendmail/src/domain.c index 741a7cd..a9bc023 100644 --- a/usr.sbin/sendmail/src/domain.c +++ b/usr.sbin/sendmail/src/domain.c @@ -36,9 +36,9 @@ #ifndef lint #if NAMED_BIND -static char sccsid[] = "@(#)domain.c 8.67 (Berkeley) 4/9/97 (with name server)"; +static char sccsid[] = "@(#)domain.c 8.68 (Berkeley) 8/2/97 (with name server)"; #else -static char sccsid[] = "@(#)domain.c 8.67 (Berkeley) 4/9/97 (without name server)"; +static char sccsid[] = "@(#)domain.c 8.68 (Berkeley) 8/2/97 (without name server)"; #endif #endif /* not lint */ @@ -854,12 +854,15 @@ gethostalias(host) char *fname; FILE *fp; register char *p = NULL; + int sff = SFF_REGONLY; char buf[MAXLINE]; static char hbuf[MAXDNAME]; + if (DontLockReadFiles) + sff |= SFF_NOLOCK; fname = getenv("HOSTALIASES"); if (fname == NULL || - (fp = safefopen(fname, O_RDONLY, 0, SFF_REGONLY)) == NULL) + (fp = safefopen(fname, O_RDONLY, 0, sff)) == NULL) return NULL; while (fgets(buf, sizeof buf, fp) != NULL) { diff --git a/usr.sbin/sendmail/src/headers.c b/usr.sbin/sendmail/src/headers.c index 940faf7..ac67f2c 100644 --- a/usr.sbin/sendmail/src/headers.c +++ b/usr.sbin/sendmail/src/headers.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)headers.c 8.110 (Berkeley) 6/14/97"; +static char sccsid[] = "@(#)headers.c 8.111 (Berkeley) 7/9/97"; #endif /* not lint */ # include <errno.h> @@ -192,7 +192,8 @@ chompheader(line, def, hdrp, e) printf("no header flags match\n"); else printf("header match, flags=%x, ruleset=%s\n", - hi->hi_flags, hi->hi_ruleset); + hi->hi_flags, + hi->hi_ruleset == NULL ? "<NULL>" : hi->hi_ruleset); } /* see if this is a resent message */ diff --git a/usr.sbin/sendmail/src/main.c b/usr.sbin/sendmail/src/main.c index b9be725..61c54e7 100644 --- a/usr.sbin/sendmail/src/main.c +++ b/usr.sbin/sendmail/src/main.c @@ -39,7 +39,7 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)main.c 8.246 (Berkeley) 6/11/97"; +static char sccsid[] = "@(#)main.c 8.249 (Berkeley) 7/25/97"; #endif /* not lint */ #define _DEFINE @@ -93,6 +93,7 @@ ADDRESS NullAddress = /* a null address */ char *CommandLineArgs; /* command line args for pid file */ bool Warn_Q_option = FALSE; /* warn about Q option use */ char **SaveArgv; /* argument vector for re-execing */ +int MissingFds = 0; /* bit map of fds missing on startup */ #ifdef NGROUPS_MAX GIDSET_T InitialGidSet[NGROUPS_MAX]; @@ -164,7 +165,6 @@ main(argc, argv, envp) extern void printqueue __P((void)); extern void sendtoargv __P((char **, ENVELOPE *)); extern void resetlimits __P((void)); - extern void drop_privileges __P((void)); /* ** Check to see if we reentered. @@ -185,11 +185,6 @@ main(argc, argv, envp) /* do machine-dependent initializations */ init_md(argc, argv); -#ifdef SIGUSR1 - /* arrange to dump state on user-1 signal */ - setsignal(SIGUSR1, sigusr1); -#endif - /* in 4.4BSD, the table can be huge; impose a reasonable limit */ DtableSize = getdtsize(); if (DtableSize > 256) @@ -200,15 +195,9 @@ main(argc, argv, envp) ** But also be sure that 0, 1, & 2 are open. */ - i = open("/dev/null", O_RDWR, 0); - if (fstat(STDIN_FILENO, &stb) < 0 && errno != EOPNOTSUPP) - (void) dup2(i, STDIN_FILENO); - if (fstat(STDOUT_FILENO, &stb) < 0 && errno != EOPNOTSUPP) - (void) dup2(i, STDOUT_FILENO); - if (fstat(STDERR_FILENO, &stb) < 0 && errno != EOPNOTSUPP) - (void) dup2(i, STDERR_FILENO); - if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO) - (void) close(i); + fill_fd(STDIN_FILENO, NULL); + fill_fd(STDOUT_FILENO, NULL); + fill_fd(STDERR_FILENO, NULL); i = DtableSize; while (--i > 0) @@ -226,6 +215,28 @@ main(argc, argv, envp) # endif #endif + if (MissingFds != 0) + { + char mbuf[MAXLINE]; + + mbuf[0] = '\0'; + if (bitset(1 << STDIN_FILENO, MissingFds)) + strcat(mbuf, ", stdin"); + if (bitset(1 << STDOUT_FILENO, MissingFds)) + strcat(mbuf, ", stdout"); + if (bitset(1 << STDERR_FILENO, MissingFds)) + strcat(mbuf, ", stderr"); + syserr("File descriptors missing on startup: %s", &mbuf[2]); + } + + /* reset status from syserr() calls for missing file descriptors */ + Errors = 0; + ExitStat = EX_OK; + +#if XDEBUG + checkfd012("after openlog"); +#endif + tTsetup(tTdvect, sizeof tTdvect, "0-99.1"); #ifdef NGROUPS_MAX @@ -238,7 +249,12 @@ main(argc, argv, envp) #endif /* drop group id privileges (RunAsUser not yet set) */ - drop_privileges(); + (void) drop_privileges(FALSE); + +#ifdef SIGUSR1 + /* arrange to dump state on user-1 signal */ + setsignal(SIGUSR1, sigusr1); +#endif /* Handle any non-getoptable constructions. */ obsolete(argv); @@ -301,6 +317,17 @@ main(argc, argv, envp) (void) snprintf(rnamebuf, sizeof rnamebuf, "Unknown UID %d", RealUid); RealUserName = rnamebuf; + /* if running non-setuid binary, pretend we are the RunAsUid */ + if (geteuid() == RealUid) + { + if (tTd(47, 1)) + printf("Non-setuid binary: RunAsUid = RealUid = %d\n", + RealUid); + RunAsUid = RealUid; + } + if (getegid() == RealGid) + RunAsGid = RealGid; + /* save command line arguments */ i = 0; for (av = argv; *av != NULL; ) @@ -572,9 +599,7 @@ main(argc, argv, envp) if (RealUid != 0) warn_C_flag = TRUE; ConfFile = optarg; - endpwent(); - (void) setgid(RealGid); - (void) setuid(RealUid); + (void) drop_privileges(TRUE); safecf = FALSE; break; @@ -726,9 +751,7 @@ main(argc, argv, envp) break; case 'X': /* traffic log file */ - endpwent(); - setgid(RealGid); - setuid(RealUid); + (void) drop_privileges(TRUE); TrafficLogFile = fopen(optarg, "a"); if (TrafficLogFile == NULL) { @@ -815,7 +838,7 @@ main(argc, argv, envp) if (OpMode != MD_DAEMON && OpMode != MD_FGDAEMON) { /* drop privileges -- daemon mode done after socket/bind */ - drop_privileges(); + (void) drop_privileges(FALSE); } /* @@ -1351,7 +1374,7 @@ main(argc, argv, envp) nullserver = getrequests(CurEnv); /* drop privileges */ - drop_privileges(); + (void) drop_privileges(FALSE); /* at this point we are in a child: reset state */ (void) newenvelope(CurEnv, CurEnv); @@ -2017,11 +2040,11 @@ sighup(sig) sm_syslog(LOG_INFO, NOQID, "restarting %s on signal", SaveArgv[0]); alarm(0); releasesignal(SIGHUP); - if (setgid(RealGid) < 0 || setuid(RealUid) < 0) + if (drop_privileges(TRUE) != EX_OK) { if (LogLevel > 0) sm_syslog(LOG_ALERT, NOQID, "could not set[ug]id(%d, %d): %m", - RealUid, RealGid); + RunAsUid, RunAsGid); exit(EX_OSERR); } execv(SaveArgv[0], (ARGV_T) SaveArgv); @@ -2033,26 +2056,91 @@ sighup(sig) ** DROP_PRIVILEGES -- reduce privileges to those of the RunAsUser option ** ** Parameters: -** none. +** to_real_uid -- if set, drop to the real uid instead +** of the RunAsUser. ** ** Returns: -** none. +** EX_OSERR if the setuid failed. +** EX_OK otherwise. */ -void -drop_privileges() +int +drop_privileges(to_real_uid) + bool to_real_uid; { + int rval = EX_OK; #ifdef NGROUPS_MAX - /* reset group permissions; these can be set later */ GIDSET_T emptygidset[NGROUPS_MAX]; +#endif + + if (tTd(47, 1)) + printf("drop_privileges(%d): Real[UG]id=%d:%d, RunAs[UG]id=%d:%d\n", + to_real_uid, RealUid, RealGid, RunAsUid, RunAsGid); + + if (to_real_uid) + { + RunAsUserName = RealUserName; + RunAsUid = RealUid; + RunAsGid = RealGid; + } + + /* make sure no one can grab open descriptors for secret files */ + endpwent(); +#ifdef NGROUPS_MAX + /* reset group permissions; these can be set later */ emptygidset[0] = RunAsGid == 0 ? getegid() : RunAsGid; (void) setgroups(1, emptygidset); #endif - if (RunAsGid != 0) - (void) setgid(RunAsGid); - if (RunAsUid != 0) - (void) setuid(RunAsUid); + + /* reset primary group and user id */ + if (RunAsGid != 0 && setgid(RunAsGid) < 0) + rval = EX_OSERR; + if (RunAsUid != 0 && setuid(RunAsUid) < 0) + rval = EX_OSERR; + return rval; +} +/* +** FILL_FD -- make sure a file descriptor has been properly allocated +** +** Used to make sure that stdin/out/err are allocated on startup +** +** Parameters: +** fd -- the file descriptor to be filled. +** where -- a string used for logging. If NULL, this is +** being called on startup, and logging should +** not be done. +** +** Returns: +** none +*/ + +void +fill_fd(fd, where) + int fd; + char *where; +{ + int i; + struct stat stbuf; + + if (fstat(fd, &stbuf) >= 0 || errno != EBADF) + return; + + if (where != NULL) + syserr("fill_fd: %s: fd %d not open", where, fd); + else + MissingFds |= 1 << fd; + i = open("/dev/null", fd == 0 ? O_RDONLY : O_WRONLY, 0666); + if (i < 0) + { + syserr("!fill_fd: %s: cannot open /dev/null", + where == NULL ? "startup" : where); + } + if (fd != i) + { + (void) dup2(i, fd); + (void) close(i); + } } /* ** TESTMODELINE -- process a test mode input line diff --git a/usr.sbin/sendmail/src/parseaddr.c b/usr.sbin/sendmail/src/parseaddr.c index 258e0a9..75b9089 100644 --- a/usr.sbin/sendmail/src/parseaddr.c +++ b/usr.sbin/sendmail/src/parseaddr.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)parseaddr.c 8.128 (Berkeley) 6/14/97"; +static char sccsid[] = "@(#)parseaddr.c 8.130 (Berkeley) 8/2/97"; #endif /* not lint */ # include "sendmail.h" @@ -2349,7 +2349,6 @@ rscheck(rwset, p1, p2, e) auto ADDRESS a1; bool saveQuickAbort = QuickAbort; bool saveSuprErrs = SuprErrs; - bool saveOnlyOneError = OnlyOneError; char buf0[MAXLINE]; char pvpbuf[PSBUFSIZE]; extern char MsgBuf[]; @@ -2387,7 +2386,7 @@ rscheck(rwset, p1, p2, e) (void) snprintf(buf, bufsize, "%s", p1); } SuprErrs = TRUE; - OnlyOneError = QuickAbort = FALSE; + QuickAbort = FALSE; pvp = prescan(buf, '\0', pvpbuf, sizeof pvpbuf, NULL, NULL); SuprErrs = saveSuprErrs; if (pvp == NULL) @@ -2413,25 +2412,38 @@ rscheck(rwset, p1, p2, e) if (LogLevel >= 4) { - if (p2 == NULL) - sm_syslog(LOG_NOTICE, e->e_id, - "Ruleset %s (%s) rejection: %s", - rwset, p1, MsgBuf); - else - sm_syslog(LOG_NOTICE, e->e_id, - "Ruleset %s (%s, %s) rejection: %s", - rwset, p1, p2, MsgBuf); + char *relay; + char *p; + char lbuf[MAXLINE]; + + p = lbuf; + if (p2 != NULL) + { + snprintf(p, SPACELEFT(lbuf, p), + ", arg2=%s", + p2); + p += strlen(p); + } + if ((relay = macvalue('_', e)) != NULL) + { + snprintf(p, SPACELEFT(lbuf, p), + ", relay=%s", relay); + p += strlen(p); + } + *p = '\0'; + sm_syslog(LOG_NOTICE, e->e_id, + "ruleset=%s, arg1=%s%s, reject=%s", + rwset, p1, lbuf, MsgBuf); } finis: /* clean up */ QuickAbort = saveQuickAbort; - OnlyOneError = saveOnlyOneError; setstat(rstat); if (buf != buf0) free(buf); - if (rstat != EX_OK && (QuickAbort || (OnlyOneError && !HoldErrs))) + if (rstat != EX_OK && QuickAbort) longjmp(TopFrame, 2); return rstat; } diff --git a/usr.sbin/sendmail/src/readcf.c b/usr.sbin/sendmail/src/readcf.c index f050fde..a8c82f7 100644 --- a/usr.sbin/sendmail/src/readcf.c +++ b/usr.sbin/sendmail/src/readcf.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)readcf.c 8.196 (Berkeley) 5/29/97"; +static char sccsid[] = "@(#)readcf.c 8.200 (Berkeley) 8/2/97"; #endif /* not lint */ # include "sendmail.h" @@ -105,13 +105,14 @@ readcf(cfname, safe, e) char *file; bool optional; int mid; - char buf[MAXLINE]; register char *p; - extern char **copyplist(); + int sff = SFF_OPENASROOT; struct stat statb; + char buf[MAXLINE]; char exbuf[MAXLINE]; char pvpbuf[MAXLINE + MAXATOM]; static char *null_list[1] = { NULL }; + extern char **copyplist __P((char **, bool)); extern char *munchstring __P((char *, char **, int)); extern void fileclass __P((int, char *, char *, bool, bool)); extern void toomany __P((int, int)); @@ -121,7 +122,9 @@ readcf(cfname, safe, e) FileName = cfname; LineNumber = 0; - cf = safefopen(cfname, O_RDONLY, 0444, SFF_OPENASROOT|SFF_NOLOCK); + if (DontLockReadFiles) + sff |= SFF_NOLOCK; + cf = safefopen(cfname, O_RDONLY, 0444, sff); if (cf == NULL) { syserr("cannot open"); @@ -438,11 +441,14 @@ readcf(cfname, safe, e) break; #endif -#ifdef SUN_EXTENSIONS +#if defined(SUN_EXTENSIONS) && defined(SUN_LOOKUP_MACRO) case 'L': /* lookup macro */ case 'G': /* lookup class */ /* reserved for Sun -- NIS+ database lookup */ - goto badline; + if (VendorCode != VENDOR_SUN) + goto badline; + sun_lg_config_line(bp, e); + break; #endif case 'M': /* define mailer */ @@ -747,6 +753,8 @@ fileclass(class, filename, fmt, safe, optional) sff = SFF_REGONLY|SFF_NOWLINK; if (safe) sff |= SFF_OPENASROOT; + if (DontLockReadFiles) + sff |= SFF_NOLOCK; f = safefopen(filename, O_RDONLY, 0, sff); } if (f == NULL) @@ -1505,6 +1513,14 @@ struct optioninfo #define O_MAXRCPT 0xa3 { "MaxRecipientPerMessage", O_MAXRCPT, FALSE }, #endif +#if _FFR_DEADLETTERDROP_OPTION +#define O_DEADLETTER 0xa4 + { "DeadLetterDrop", O_DEADLETTER, FALSE }, +#endif +#if _FFR_DONTLOCKFILESFORREAD_OPTION +#define O_DONTLOCK 0xa5 + { "DontLockFilesForRead", O_DONTLOCK, FALSE }, +#endif { NULL, '\0', FALSE } }; @@ -1644,14 +1660,7 @@ setoption(opt, val, safe, sticky, e) { if (tTd(37, 1)) printf(" (unsafe)"); - if (RealUid != geteuid()) - { - if (tTd(37, 1)) - printf("(Resetting uid)"); - endpwent(); - (void) setgid(RealGid); - (void) setuid(RealUid); - } + (void) drop_privileges(TRUE); } } if (tTd(37, 1)) @@ -2256,7 +2265,10 @@ setoption(opt, val, safe, sticky, e) } } if (isascii(*val) && isdigit(*val)) - RunAsUid = atoi(val); + { + if (RunAsUid == 0) + RunAsUid = atoi(val); + } else { register struct passwd *pw; @@ -2264,7 +2276,7 @@ setoption(opt, val, safe, sticky, e) pw = sm_getpwnam(val); if (pw == NULL) syserr("readcf: option RunAsUser: unknown user %s", val); - else + else if (RunAsUid == 0) { if (*p == '\0') RunAsUserName = newstr(val); @@ -2275,7 +2287,10 @@ setoption(opt, val, safe, sticky, e) if (*p == '\0') break; if (isascii(*p) && isdigit(*p)) - RunAsGid = atoi(p); + { + if (RunAsGid == 0) + RunAsGid = atoi(p); + } else { register struct group *gr; @@ -2284,7 +2299,7 @@ setoption(opt, val, safe, sticky, e) if (gr == NULL) syserr("readcf: option RunAsUser: unknown group %s", p); - else + else if (RunAsGid == 0) RunAsGid = gr->gr_gid; } break; @@ -2326,6 +2341,20 @@ setoption(opt, val, safe, sticky, e) break; #endif +#if _FFR_DEADLETTERDROP_OPTION + case O_DEADLETTER: + if (DeadLetterDrop != NULL) + free(DeadLetterDrop); + DeadLetterDrop = newstr(val); + break; +#endif + +#if _FFR_DONTLOCKFILESFORREAD_OPTION + case O_DONTLOCK: + DontLockReadFiles = atobool(val); + break; +#endif + default: if (tTd(37, 1)) { diff --git a/usr.sbin/sendmail/src/savemail.c b/usr.sbin/sendmail/src/savemail.c index 894352c..40ad883 100644 --- a/usr.sbin/sendmail/src/savemail.c +++ b/usr.sbin/sendmail/src/savemail.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)savemail.c 8.110 (Berkeley) 4/7/97"; +static char sccsid[] = "@(#)savemail.c 8.114 (Berkeley) 8/2/97"; #endif /* not lint */ # include "sendmail.h" @@ -70,10 +70,6 @@ static char sccsid[] = "@(#)savemail.c 8.110 (Berkeley) 4/7/97"; # define ESM_PANIC 6 /* leave the locked queue/transcript files */ # define ESM_DONE 7 /* the message is successfully delivered */ -# ifndef _PATH_VARTMP -# define _PATH_VARTMP "/usr/tmp/" -# endif - void savemail(e, sendbody) @@ -301,7 +297,8 @@ savemail(e, sendbody) */ q = NULL; - if (sendtolist(DoubleBounceAddr, NULL, &q, 0, e) <= 0) + if (sendtolist(DoubleBounceAddr, + NULLADDR, &q, 0, e) <= 0) { syserr("553 cannot parse %s!", DoubleBounceAddr); ExitStat = EX_SOFTWARE; @@ -375,17 +372,16 @@ savemail(e, sendbody) break; } - if (SafeFileEnv != NULL && SafeFileEnv[0] != '\0') + if ((SafeFileEnv != NULL && SafeFileEnv[0] != '\0') || + DeadLetterDrop == NULL || DeadLetterDrop[0] == '\0') { state = ESM_PANIC; break; } - snprintf(buf, sizeof buf, "%sdead.letter", _PATH_VARTMP); - flags = SFF_NOLINK|SFF_CREAT|SFF_REGONLY|SFF_OPENASROOT|SFF_MUSTOWN; - if (!writable(buf, NULL, flags) || - (fp = safefopen(buf, O_WRONLY|O_CREAT|O_APPEND, + if (!writable(DeadLetterDrop, NULL, flags) || + (fp = safefopen(DeadLetterDrop, O_WRONLY|O_APPEND, FileMode, flags)) == NULL) { state = ESM_PANIC; @@ -410,15 +406,15 @@ savemail(e, sendbody) int oldverb = Verbose; Verbose = 1; - message("Saved message in %s", buf); + message("Saved message in %s", DeadLetterDrop); Verbose = oldverb; if (LogLevel > 3) sm_syslog(LOG_NOTICE, e->e_id, "Saved message in %s", - buf); + DeadLetterDrop); state = ESM_DONE; } - (void) xfclose(fp, "savemail", buf); + (void) xfclose(fp, "savemail", DeadLetterDrop); break; default: @@ -758,8 +754,11 @@ errbody(mci, e, separator) { if (*ErrMsgFile == '/') { - xfile = safefopen(ErrMsgFile, O_RDONLY, 0444, - SFF_ROOTOK|SFF_REGONLY); + int sff = SFF_ROOTOK|SFF_REGONLY; + + if (DontLockReadFiles) + sff |= SFF_NOLOCK; + xfile = safefopen(ErrMsgFile, O_RDONLY, 0444, sff); if (xfile != NULL) { while (fgets(buf, sizeof buf, xfile) != NULL) diff --git a/usr.sbin/sendmail/src/sendmail.h b/usr.sbin/sendmail/src/sendmail.h index 2eb40c8..00559ea 100644 --- a/usr.sbin/sendmail/src/sendmail.h +++ b/usr.sbin/sendmail/src/sendmail.h @@ -31,7 +31,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)sendmail.h 8.236 (Berkeley) 6/5/97 + * @(#)sendmail.h 8.242 (Berkeley) 8/2/97 */ /* @@ -41,7 +41,7 @@ # ifdef _DEFINE # define EXTERN # ifndef lint -static char SmailSccsId[] = "@(#)sendmail.h 8.236 6/5/97"; +static char SmailSccsId[] = "@(#)sendmail.h 8.242 8/2/97"; # endif # else /* _DEFINE */ # define EXTERN extern @@ -94,6 +94,25 @@ static char SmailSccsId[] = "@(#)sendmail.h 8.236 6/5/97"; # endif #endif +/* +** Following are "sort of" configuration constants, but they should +** be pretty solid on most architectures today. They have to be +** defined after <arpa/nameser.h> because some versions of that +** file also define them. In all cases, we can't use sizeof because +** some systems (e.g., Crays) always treat everything as being at +** least 64 bits. +*/ + +#ifndef INADDRSZ +# define INADDRSZ 4 /* size of an IPv4 address in bytes */ +#endif +#ifndef INT16SZ +# define INT16SZ 2 /* size of a 16 bit integer in bytes */ +#endif +#ifndef INT32SZ +# define INT32SZ 4 /* size of a 32 bit integer in bytes */ +#endif + /* forward references for prototypes */ @@ -426,7 +445,7 @@ extern void addheader __P((char *, char *, HDR **)); extern char *hvalue __P((char *, HDR *)); extern void commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *)); extern void put_vanilla_header __P((HDR *, char *, MCI *)); -extern void eatheader __P((ENVELOPE *e, bool)); +extern void eatheader __P((ENVELOPE *, bool)); extern int chompheader __P((char *, bool, HDR **, ENVELOPE *)); /* ** Envelope structure. @@ -1197,12 +1216,14 @@ EXTERN bool DoQueueRun; /* non-interrupt time queue run needed */ #if _FFR_DSN_RRT_OPTION EXTERN bool RrtImpliesDsn; /* turn Return-Receipt-To: into DSN */ #endif +EXTERN char *DeadLetterDrop; /* path to dead letter office */ EXTERN bool DontProbeInterfaces; /* don't probe interfaces for names */ EXTERN bool ChownAlwaysSafe; /* treat chown(2) as safe */ EXTERN bool IgnoreHostStatus; /* ignore long term host status files */ EXTERN bool SingleThreadDelivery; /* single thread hosts on delivery */ EXTERN bool UnsafeGroupWrites; /* group-writable files are unsafe */ EXTERN bool SingleLineFromHeader; /* force From: header to be one line */ +EXTERN bool DontLockReadFiles; /* don't read lock support files */ EXTERN int ConnRateThrottle; /* throttle for SMTP connection rate */ EXTERN int MaxAliasRecursion; /* maximum depth of alias recursion */ EXTERN int MaxMacroRecursion; /* maximum depth of macro recursion */ @@ -1396,6 +1417,8 @@ extern int prog_open __P((char **, int *, ENVELOPE *)); extern bool getcanonname __P((char *, int, bool)); extern bool path_is_dir __P((char *, bool)); extern pid_t dowork __P((char *, bool, bool, ENVELOPE *)); +extern int drop_privileges __P((bool)); +extern void fill_fd __P((int, char *)); extern const char *errstring __P((int)); extern sigfunc_t setsignal __P((int, sigfunc_t)); @@ -1419,7 +1442,7 @@ extern void syserr(const char *, ...); extern void usrerr(const char *, ...); extern void message(const char *, ...); extern void nmessage(const char *, ...); -extern void setproctitle(const char *fmt, ...); +extern void setproctitle(const char *, ...); extern void sm_syslog(int, const char *, const char *, ...); #else extern void auth_warning(); diff --git a/usr.sbin/sendmail/src/srvrsmtp.c b/usr.sbin/sendmail/src/srvrsmtp.c index fa39e68..3255e83 100644 --- a/usr.sbin/sendmail/src/srvrsmtp.c +++ b/usr.sbin/sendmail/src/srvrsmtp.c @@ -36,9 +36,9 @@ #ifndef lint #if SMTP -static char sccsid[] = "@(#)srvrsmtp.c 8.146 (Berkeley) 6/11/97 (with SMTP)"; +static char sccsid[] = "@(#)srvrsmtp.c 8.154 (Berkeley) 8/2/97 (with SMTP)"; #else -static char sccsid[] = "@(#)srvrsmtp.c 8.146 (Berkeley) 6/11/97 (without SMTP)"; +static char sccsid[] = "@(#)srvrsmtp.c 8.154 (Berkeley) 8/2/97 (without SMTP)"; #endif #endif /* not lint */ @@ -154,6 +154,7 @@ smtp(nullserver, e) volatile int n_helo = 0; /* count of HELO/EHLO commands */ bool ok; int lognullconnection = TRUE; + register char *q; char inp[MAXLINE]; char cmdbuf[MAXLINE]; extern ENVELOPE BlankEnvelope; @@ -221,16 +222,7 @@ smtp(nullserver, e) for (;;) { /* arrange for backout */ - if (setjmp(TopFrame) > 0) - { - /* if() nesting is necessary for Cray UNICOS */ - if (InChild) - { - QuickAbort = FALSE; - SuprErrs = TRUE; - finis(); - } - } + (void) setjmp(TopFrame); QuickAbort = FALSE; HoldErrs = FALSE; SuprErrs = FALSE; @@ -375,51 +367,50 @@ smtp(nullserver, e) cmdbuf); break; } - else - { - register char *q; - for (q = p; *q != '\0'; q++) - { - if (!isascii(*q)) - break; - if (isalnum(*q)) - continue; - if (isspace(*q)) - { - *q = '\0'; - break; - } - if (strchr("[].-_#", *q) == NULL) - break; - } - if (*q != '\0') + for (q = p; *q != '\0'; q++) + { + if (!isascii(*q)) + break; + if (isalnum(*q)) + continue; + if (isspace(*q)) { - if (!AllowBogusHELO) - usrerr("501 Invalid domain name"); - else - { - message("250 %s Invalid domain name, accepting anyway", - MyHostName); - gothello = TRUE; - } + *q = '\0'; break; } + if (strchr("[].-_#", *q) == NULL) + break; + } + if (*q == '\0') + { + q = "pleased to meet you"; + sendinghost = newstr(p); + } + else if (!AllowBogusHELO) + { + usrerr("501 Invalid domain name"); + break; + } + else + { + q = "accepting invalid domain name"; } - sendinghost = newstr(p); gothello = TRUE; + + /* print HELO response message */ if (c->cmdcode != CMDEHLO) { - /* print old message and be done with it */ - message("250 %s Hello %s, pleased to meet you", - MyHostName, CurSmtpClient); + message("250 %s Hello %s, %s", + MyHostName, CurSmtpClient, q); break; } - /* print extended message and brag */ - message("250-%s Hello %s, pleased to meet you", - MyHostName, CurSmtpClient); + message("250-%s Hello %s, %s", + MyHostName, CurSmtpClient, q); + + /* print EHLO features list */ if (!bitset(PRIV_NOEXPN, PrivacyFlags)) { message("250-EXPN"); @@ -446,23 +437,14 @@ smtp(nullserver, e) SmtpPhase = "server MAIL"; /* check for validity of this command */ - if (!gothello) + if (!gothello && bitset(PRIV_NEEDMAILHELO, PrivacyFlags)) { - /* set sending host to our known value */ - if (sendinghost == NULL) - sendinghost = peerhostname; - - if (bitset(PRIV_NEEDMAILHELO, PrivacyFlags)) - { - usrerr("503 Polite people say HELO first"); - break; - } + usrerr("503 Polite people say HELO first"); + break; } if (gotmail) { usrerr("503 Sender already specified"); - if (InChild) - finis(); break; } if (InChild) @@ -472,6 +454,10 @@ smtp(nullserver, e) finis(); } + /* make sure we know who the sending host is */ + if (sendinghost == NULL) + sendinghost = peerhostname; + p = skipword(p, "from"); if (p == NULL) break; @@ -479,6 +465,8 @@ smtp(nullserver, e) /* fork a subprocess to process this command */ if (runinchild("SMTP-MAIL", e) > 0) break; + if (Errors > 0) + goto undo_subproc_no_pm; if (!gothello) { auth_warning(e, @@ -500,6 +488,8 @@ smtp(nullserver, e) define('r', protocol, e); define('s', sendinghost, e); initsys(e); + if (Errors > 0) + goto undo_subproc_no_pm; nrcpts = 0; e->e_flags |= EF_LOGSENDER|EF_CLRQUEUE; setproctitle("%s %s: %.80s", e->e_id, CurSmtpClient, inp); @@ -508,6 +498,8 @@ smtp(nullserver, e) if (setjmp(TopFrame) > 0) { /* this failed -- undo work */ + undo_subproc_no_pm: + e->e_flags &= ~EF_PM_NOTIFY; undo_subproc: if (InChild) { @@ -525,10 +517,13 @@ smtp(nullserver, e) setsender(p, e, &delimptr, ' ', FALSE); if (delimptr != NULL && *delimptr != '\0') *delimptr++ = '\0'; + if (Errors > 0) + goto undo_subproc_no_pm; /* do config file checking of the sender */ - if (rscheck("check_mail", p, NULL, e) != EX_OK) - goto undo_subproc; + if (rscheck("check_mail", p, NULL, e) != EX_OK || + Errors > 0) + goto undo_subproc_no_pm; /* check for possible spoofing */ if (RealUid != 0 && OpMode == MD_SMTP && @@ -579,20 +574,26 @@ smtp(nullserver, e) vp == NULL ? "<null>" : vp); mail_esmtp_args(kp, vp, e); + if (Errors > 0) + goto undo_subproc_no_pm; } + if (Errors > 0) + goto undo_subproc_no_pm; if (MaxMessageSize > 0 && e->e_msgsize > MaxMessageSize) { usrerr("552 Message size exceeds fixed maximum message size (%ld)", MaxMessageSize); - /* NOTREACHED */ + goto undo_subproc_no_pm; } if (!enoughdiskspace(e->e_msgsize)) { usrerr("452 Insufficient disk space; try again later"); - break; + goto undo_subproc_no_pm; } + if (Errors > 0) + goto undo_subproc_no_pm; message("250 Sender ok"); gotmail = TRUE; break; @@ -615,7 +616,7 @@ smtp(nullserver, e) /* limit flooding of our machine */ if (MaxRcptPerMsg > 0 && nrcpts >= MaxRcptPerMsg) { - usrerr("450 Too many recipients"); + usrerr("452 Too many recipients"); break; } @@ -626,13 +627,14 @@ smtp(nullserver, e) if (p == NULL) break; a = parseaddr(p, NULLADDR, RF_COPYALL, ' ', &delimptr, e); - if (a == NULL) + if (a == NULL || Errors > 0) break; if (delimptr != NULL && *delimptr != '\0') *delimptr++ = '\0'; /* do config file checking of the recipient */ - if (rscheck("check_rcpt", p, NULL, e) != EX_OK) + if (rscheck("check_rcpt", p, NULL, e) != EX_OK || + Errors > 0) break; /* now parse ESMTP arguments */ @@ -673,12 +675,15 @@ smtp(nullserver, e) vp == NULL ? "<null>" : vp); rcpt_esmtp_args(a, kp, vp, e); + if (Errors > 0) + break; } + if (Errors > 0) + break; /* save in recipient list after ESMTP mods */ a = recipient(a, &e->e_sendqueue, 0, e); - - if (Errors != 0) + if (Errors > 0) break; /* no errors during parsing, but might be a duplicate */ @@ -732,9 +737,12 @@ smtp(nullserver, e) SmtpPhase = "collect"; buffer_errors(); collect(InChannel, TRUE, NULL, e); - flush_errors(TRUE); - if (Errors != 0) + if (Errors > 0) + { + flush_errors(TRUE); + buffer_errors(); goto abortmessage; + } /* make sure we actually do delivery */ e->e_flags &= ~EF_CLRQUEUE; @@ -781,13 +789,19 @@ smtp(nullserver, e) message("250 %s Message accepted for delivery", id); /* if we just queued, poke it */ - if (doublequeue && e->e_sendmode != SM_QUEUE && + if (doublequeue && + e->e_sendmode != SM_QUEUE && e->e_sendmode != SM_DEFER) { - extern pid_t dowork(); + CurrentLA = getla(); + + if (!shouldqueue(e->e_msgpriority, e->e_ctime)) + { + extern pid_t dowork(); - unlockqueue(e); - (void) dowork(id, TRUE, TRUE, e); + unlockqueue(e); + (void) dowork(id, TRUE, TRUE, e); + } } abortmessage: @@ -849,11 +863,15 @@ smtp(nullserver, e) } if (runinchild(vrfy ? "SMTP-VRFY" : "SMTP-EXPN", e) > 0) break; + if (Errors > 0) + goto undo_subproc; if (LogLevel > 5) sm_syslog(LOG_INFO, e->e_id, "%.100s: %s", CurSmtpClient, shortenstring(inp, 203)); + if (setjmp(TopFrame) > 0) + goto undo_subproc; vrfyqueue = NULL; if (vrfy) e->e_flags |= EF_VRFYONLY; @@ -867,12 +885,8 @@ smtp(nullserver, e) { (void) sendtolist(p, NULLADDR, &vrfyqueue, 0, e); } - if (Errors != 0) - { - if (InChild) - finis(); - break; - } + if (Errors > 0) + goto undo_subproc; if (vrfyqueue == NULL) { usrerr("554 Nothing to %s", vrfy ? "VRFY" : "EXPN"); @@ -916,7 +930,7 @@ smtp(nullserver, e) QueueLimitRecipient = id; ok = runqueue(TRUE, TRUE); QueueLimitRecipient = NULL; - if (ok) + if (ok && Errors == 0) message("250 Queuing for node %s started", p); break; @@ -1427,12 +1441,15 @@ help(topic) register FILE *hf; int len; bool noinfo; + int sff = SFF_OPENASROOT|SFF_REGONLY; char buf[MAXLINE]; extern char Version[]; + if (DontLockReadFiles) + sff |= SFF_NOLOCK; if (HelpFile == NULL || - (hf = safefopen(HelpFile, O_RDONLY, 0444, SFF_OPENASROOT|SFF_REGONLY|SFF_NOLOCK)) == NULL) + (hf = safefopen(HelpFile, O_RDONLY, 0444, sff)) == NULL) { /* no help */ errno = 0; diff --git a/usr.sbin/sendmail/src/util.c b/usr.sbin/sendmail/src/util.c index 5e5e7af..c655b62 100644 --- a/usr.sbin/sendmail/src/util.c +++ b/usr.sbin/sendmail/src/util.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)util.c 8.129 (Berkeley) 6/11/97"; +static char sccsid[] = "@(#)util.c 8.133 (Berkeley) 8/1/97"; #endif /* not lint */ # include "sendmail.h" @@ -536,13 +536,14 @@ putxline(l, len, mci, pxflags) int pxflags; { register char *p, *end; - register char svchar; int slop = 0; /* strip out 0200 bits -- these can look like TELNET protocol */ if (bitset(MCIF_7BIT, mci->mci_flags) || bitset(PXLF_STRIP8BIT, pxflags)) { + register char svchar; + for (p = l; (svchar = *p) != '\0'; ++p) if (bitset(0200, svchar)) *p = svchar &~ 0200; @@ -563,10 +564,9 @@ putxline(l, len, mci, pxflags) while (mci->mci_mailer->m_linelimit > 0 && (p - l + slop) > mci->mci_mailer->m_linelimit) { + char *l_base = l; register char *q = &l[mci->mci_mailer->m_linelimit - slop - 1]; - svchar = *q; - *q = '\0'; if (l[0] == '.' && slop == 0 && bitnset(M_XDOT, mci->mci_mailer->m_flags)) { @@ -583,19 +583,18 @@ putxline(l, len, mci, pxflags) if (TrafficLogFile != NULL) (void) putc('>', TrafficLogFile); } - fputs(l, mci->mci_out); + while (l < q) + (void) putc(*l++, mci->mci_out); (void) putc('!', mci->mci_out); fputs(mci->mci_mailer->m_eol, mci->mci_out); (void) putc(' ', mci->mci_out); if (TrafficLogFile != NULL) { - for ( ; l < q; ++l) + for (l = l_base; l < q; l++) (void) putc(*l, TrafficLogFile); fprintf(TrafficLogFile, "!\n%05d >>> ", (int) getpid()); } - *q = svchar; - l = q; slop = 1; } @@ -625,7 +624,7 @@ putxline(l, len, mci, pxflags) if (TrafficLogFile != NULL) (void) putc('\n', TrafficLogFile); fputs(mci->mci_mailer->m_eol, mci->mci_out); - if (*l == '\n') + if (l < end && *l == '\n') { if (*++l != ' ' && *l != '\t' && *l != '\0') { @@ -1062,21 +1061,7 @@ checkfd012(where) struct stat stbuf; for (i = 0; i < 3; i++) - { - if (fstat(i, &stbuf) < 0 && errno == EBADF) - { - /* oops.... */ - int fd; - - syserr("%s: fd %d not open", where, i); - fd = open("/dev/null", i == 0 ? O_RDONLY : O_WRONLY, 0666); - if (fd != i) - { - (void) dup2(fd, i); - (void) close(fd); - } - } - } + fill_fd(i, where); #endif /* XDEBUG */ } /* @@ -1210,7 +1195,8 @@ dumpfd(fd, printclosed, logit) #ifdef S_IFSOCK SOCKADDR sa; #endif - auto int slen; + auto SOCKADDR_LEN_T slen; + int i; struct stat st; char buf[200]; extern char *hostnamebyanyaddr(); @@ -1235,10 +1221,10 @@ dumpfd(fd, printclosed, logit) return; } - slen = fcntl(fd, F_GETFL, NULL); - if (slen != -1) + i = fcntl(fd, F_GETFL, NULL); + if (i != -1) { - snprintf(p, SPACELEFT(buf, p), "fl=0x%x, ", slen); + snprintf(p, SPACELEFT(buf, p), "fl=0x%x, ", i); p += strlen(p); } |