From 951742c4c0284d2ebe731540f4ff5f4a7aaab581 Mon Sep 17 00:00:00 2001 From: Gregory Neil Shapiro Date: Mon, 9 Apr 2007 01:44:16 +0000 Subject: [PATCH] Resolve conflicts from sendmail 8.14.1 import --- contrib/sendmail/mail.local/mail.local.c | 4 +- contrib/sendmail/src/conf.c | 561 +++++++++++------------ contrib/sendmail/src/conf.h | 13 +- contrib/sendmail/src/err.c | 48 +- contrib/sendmail/src/headers.c | 288 ++++++++---- contrib/sendmail/src/mailq.1 | 26 +- contrib/sendmail/src/mci.c | 34 +- contrib/sendmail/src/savemail.c | 140 +++--- 8 files changed, 616 insertions(+), 498 deletions(-) diff --git a/contrib/sendmail/mail.local/mail.local.c b/contrib/sendmail/mail.local/mail.local.c index b5ccd5b9ed37..cba40a72df39 100644 --- a/contrib/sendmail/mail.local/mail.local.c +++ b/contrib/sendmail/mail.local/mail.local.c @@ -20,7 +20,7 @@ SM_IDSTR(copyright, Copyright (c) 1990, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n") -SM_IDSTR(id, "@(#)$Id: mail.local.c,v 8.253 2004/11/01 20:42:42 ca Exp $") +SM_IDSTR(id, "@(#)$Id: mail.local.c,v 8.254 2006/10/12 22:23:45 ca Exp $") #include #include @@ -177,6 +177,8 @@ const char *hashname __P((char *)); #endif /* HASHSPOOL */ +static void sm_exit __P((int)); + static void sm_exit(status) int status; diff --git a/contrib/sendmail/src/conf.c b/contrib/sendmail/src/conf.c index f299d5c15e82..64b8d02b51d0 100644 --- a/contrib/sendmail/src/conf.c +++ b/contrib/sendmail/src/conf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -14,13 +14,17 @@ #include -SM_RCSID("@(#)$Id: conf.c,v 8.1082 2006/03/22 22:49:33 ca Exp $") +SM_RCSID("@(#)$Id: conf.c,v 8.1128 2007/04/03 21:32:29 ca Exp $") +#include #include #if NEWDB # include "sm/bdb.h" #endif /* NEWDB */ +#include +#include "map.h" + #ifdef DEC # if NETINET6 /* for the IPv6 device lookup */ @@ -159,9 +163,7 @@ struct prival PrivacyValues[] = { "noreceipts", PRIV_NORECEIPTS }, { "nobodyreturn", PRIV_NOBODYRETN }, { "goaway", PRIV_GOAWAY }, -#if _FFR_PRIV_NOACTUALRECIPIENT { "noactualrecipient", PRIV_NOACTUALRECIPIENT }, -#endif /* _FFR_PRIV_NOACTUALRECIPIENT */ { NULL, 0 } }; @@ -379,7 +381,7 @@ setdefaults(e) InetMode = AF_INET; #endif /* NETINET6 */ ControlSocketName = NULL; - memset(&ConnectOnlyTo, '\0', sizeof ConnectOnlyTo); + memset(&ConnectOnlyTo, '\0', sizeof(ConnectOnlyTo)); DataFileBufferSize = 4096; XscriptFileBufferSize = 4096; for (i = 0; i < MAXRWSETS; i++) @@ -414,7 +416,7 @@ setdefuser() (void) sm_strlcpy(defuserbuf, (defpwent == NULL || defpwent->pw_name == NULL) ? "nobody" : defpwent->pw_name, - sizeof defuserbuf); + sizeof(defuserbuf)); if (tTd(37, 4)) sm_dprintf("setdefuser: DefUid=%d, DefUser=%s\n", (int) DefUid, DefUser); @@ -433,7 +435,7 @@ setupqueues() char buf[100]; MaxRunnersPerQueue = 1; - (void) sm_strlcpy(buf, "mqueue, P=/var/spool/mqueue", sizeof buf); + (void) sm_strlcpy(buf, "mqueue, P=/var/spool/mqueue", sizeof(buf)); makequeue(buf, false); } /* @@ -446,15 +448,15 @@ setupmailers() char buf[100]; (void) sm_strlcpy(buf, "prog, P=/bin/sh, F=lsouDq9, T=X-Unix/X-Unix/X-Unix, A=sh -c \201u", - sizeof buf); + sizeof(buf)); makemailer(buf); (void) sm_strlcpy(buf, "*file*, P=[FILE], F=lsDFMPEouq9, T=X-Unix/X-Unix/X-Unix, A=FILE \201u", - sizeof buf); + sizeof(buf)); makemailer(buf); (void) sm_strlcpy(buf, "*include*, P=/dev/null, F=su, A=INCLUDE \201u", - sizeof buf); + sizeof(buf)); makemailer(buf); initerrmailers(); } @@ -665,6 +667,13 @@ setupmaps() socket_map_lookup, null_map_store); #endif /* SOCKETMAP */ +#if _FFR_DPRINTF_MAP + /* dprintf map -- logs information to syslog */ + MAPDEF("dprintf", NULL, 0, + dprintf_map_parseargs, null_map_open, null_map_close, + dprintf_map_lookup, null_map_store); +#endif /* _FFR_DPRINTF_MAP */ + if (tTd(38, 2)) { /* bogus map -- always return tempfail */ @@ -704,59 +713,6 @@ inithostmaps() short mapreturn[MAXMAPACTIONS]; char buf[MAXLINE]; - /* - ** Set up default hosts maps. - */ - -#if 0 - nmaps = switch_map_find("hosts", maptype, mapreturn); - for (i = 0; i < nmaps; i++) - { - if (strcmp(maptype[i], "files") == 0 && - stab("hosts.files", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "hosts.files text -k 0 -v 1 /etc/hosts", - sizeof buf); - (void) makemapentry(buf); - } -# if NAMED_BIND - else if (strcmp(maptype[i], "dns") == 0 && - stab("hosts.dns", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "hosts.dns dns A", sizeof buf); - (void) makemapentry(buf); - } -# endif /* NAMED_BIND */ -# if NISPLUS - else if (strcmp(maptype[i], "nisplus") == 0 && - stab("hosts.nisplus", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "hosts.nisplus nisplus -k name -v address hosts.org_dir", - sizeof buf); - (void) makemapentry(buf); - } -# endif /* NISPLUS */ -# if NIS - else if (strcmp(maptype[i], "nis") == 0 && - stab("hosts.nis", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "hosts.nis nis -k 0 -v 1 hosts.byname", - sizeof buf); - (void) makemapentry(buf); - } -# endif /* NIS */ -# if NETINFO - else if (strcmp(maptype[i], "netinfo") == 0 && - stab("hosts.netinfo", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "hosts.netinfo netinfo -v name /machines", - sizeof buf); - (void) makemapentry(buf); - } -# endif /* NETINFO */ - } -#endif /* 0 */ - /* ** Make sure we have a host map. */ @@ -764,10 +720,10 @@ inithostmaps() if (stab("host", ST_MAP, ST_FIND) == NULL) { /* user didn't initialize: set up host map */ - (void) sm_strlcpy(buf, "host host", sizeof buf); + (void) sm_strlcpy(buf, "host host", sizeof(buf)); #if NAMED_BIND if (ConfigLevel >= 2) - (void) sm_strlcat(buf, " -a. -D", sizeof buf); + (void) sm_strlcat(buf, " -a. -D", sizeof(buf)); #endif /* NAMED_BIND */ (void) makemapentry(buf); } @@ -783,7 +739,7 @@ inithostmaps() stab("aliases.files", ST_MAP, ST_FIND) == NULL) { (void) sm_strlcpy(buf, "aliases.files null", - sizeof buf); + sizeof(buf)); (void) makemapentry(buf); } #if NISPLUS @@ -791,7 +747,7 @@ inithostmaps() stab("aliases.nisplus", ST_MAP, ST_FIND) == NULL) { (void) sm_strlcpy(buf, "aliases.nisplus nisplus -kalias -vexpansion mail_aliases.org_dir", - sizeof buf); + sizeof(buf)); (void) makemapentry(buf); } #endif /* NISPLUS */ @@ -800,7 +756,7 @@ inithostmaps() stab("aliases.nis", ST_MAP, ST_FIND) == NULL) { (void) sm_strlcpy(buf, "aliases.nis nis mail.aliases", - sizeof buf); + sizeof(buf)); (void) makemapentry(buf); } #endif /* NIS */ @@ -809,7 +765,7 @@ inithostmaps() stab("aliases.netinfo", ST_MAP, ST_FIND) == NULL) { (void) sm_strlcpy(buf, "aliases.netinfo netinfo -z, /aliases", - sizeof buf); + sizeof(buf)); (void) makemapentry(buf); } #endif /* NETINFO */ @@ -818,66 +774,28 @@ inithostmaps() stab("aliases.hesiod", ST_MAP, ST_FIND) == NULL) { (void) sm_strlcpy(buf, "aliases.hesiod hesiod aliases", - sizeof buf); + sizeof(buf)); (void) makemapentry(buf); } #endif /* HESIOD */ +#if LDAPMAP && defined(SUN_EXTENSIONS) && \ + defined(SUN_SIMPLIFIED_LDAP) && HASLDAPGETALIASBYNAME + else if (strcmp(maptype[i], "ldap") == 0 && + stab("aliases.ldap", ST_MAP, ST_FIND) == NULL) + { + (void) strlcpy(buf, "aliases.ldap ldap -b . -h localhost -k mail=%0 -v mailgroup", + sizeof buf); + (void) makemapentry(buf); + } +#endif /* LDAPMAP && defined(SUN_EXTENSIONS) && ... */ } if (stab("aliases", ST_MAP, ST_FIND) == NULL) { - (void) sm_strlcpy(buf, "aliases switch aliases", sizeof buf); + (void) sm_strlcpy(buf, "aliases switch aliases", sizeof(buf)); (void) makemapentry(buf); } - -#if 0 /* "user" map class is a better choice */ - /* - ** Set up default users maps. - */ - - nmaps = switch_map_find("passwd", maptype, mapreturn); - for (i = 0; i < nmaps; i++) - { - if (strcmp(maptype[i], "files") == 0 && - stab("users.files", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "users.files text -m -z: -k0 -v6 /etc/passwd", - sizeof buf); - (void) makemapentry(buf); - } -# if NISPLUS - else if (strcmp(maptype[i], "nisplus") == 0 && - stab("users.nisplus", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "users.nisplus nisplus -m -kname -vhome passwd.org_dir", - sizeof buf); - (void) makemapentry(buf); - } -# endif /* NISPLUS */ -# if NIS - else if (strcmp(maptype[i], "nis") == 0 && - stab("users.nis", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "users.nis nis -m passwd.byname", - sizeof buf); - (void) makemapentry(buf); - } -# endif /* NIS */ -# if HESIOD - else if (strcmp(maptype[i], "hesiod") == 0 && - stab("users.hesiod", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "users.hesiod hesiod", sizeof buf); - (void) makemapentry(buf); - } -# endif /* HESIOD */ - } - if (stab("users", ST_MAP, ST_FIND) == NULL) - { - (void) sm_strlcpy(buf, "users switch -m passwd", sizeof buf); - (void) makemapentry(buf); - } -#endif /* 0 */ } + /* ** SWITCH_MAP_FIND -- find the list of types associated with a map ** @@ -1044,7 +962,7 @@ switch_map_find(service, maptype, mapreturn) char buf[MAXLINE]; while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf, - sizeof buf) != NULL) + sizeof(buf)) != NULL) { register char *p; @@ -1327,6 +1245,25 @@ checkcompat(to, e) #endif /* EXAMPLE_CODE */ return EX_OK; } + +#ifdef SUN_EXTENSIONS +static void +init_md_sun() +{ + struct stat sbuf; + + /* Check for large file descriptor */ + if (fstat(fileno(stdin), &sbuf) < 0) + { + if (errno == EOVERFLOW) + { + perror("stdin"); + exit(EX_NOINPUT); + } + } +} +#endif /* SUN_EXTENSIONS */ + /* ** INIT_MD -- do machine dependent initializations ** @@ -1359,7 +1296,7 @@ init_md(argc, argv) /* keep gethostby*() from stripping the local domain name */ set_domain_trim_off(); #endif /* _CONVEX_SOURCE */ -#ifdef __QNX__ +#if defined(__QNX__) && !defined(__QNXNTO__) /* ** Due to QNX's network distributed nature, you can target a tcpip ** stack on a different node in the qnx network; this patch lets @@ -1528,12 +1465,12 @@ getla() { # ifdef _AUX_SOURCE (void) sm_strlcpy(Nl[X_AVENRUN].n_name, LA_AVENRUN, - sizeof Nl[X_AVENRUN].n_name); + sizeof(Nl[X_AVENRUN].n_name)); Nl[1].n_name[0] = '\0'; # endif /* _AUX_SOURCE */ # if defined(_AIX3) || defined(_AIX4) - if (knlist(Nl, 1, sizeof Nl[0]) < 0) + if (knlist(Nl, 1, sizeof(Nl[0])) < 0) # else /* defined(_AIX3) || defined(_AIX4) */ if (nlist(_PATH_UNIX, Nl) < 0) # endif /* defined(_AIX3) || defined(_AIX4) */ @@ -2006,7 +1943,7 @@ getla() } } - r = read(afd, &avenrun, sizeof avenrun); + r = read(afd, &avenrun, sizeof(avenrun)); if (tTd(3, 5)) sm_dprintf("getla: avenrun = %d\n", avenrun); @@ -2153,7 +2090,7 @@ sm_getla() char labuf[8]; CurrentLA = getla(); - (void) sm_snprintf(labuf, sizeof labuf, "%d", CurrentLA); + (void) sm_snprintf(labuf, sizeof(labuf), "%d", CurrentLA); macdefine(&GlobalMacros, A_TEMP, macid("{load_avg}"), labuf); } /* @@ -2209,26 +2146,18 @@ shouldqueue(pri, ct) sm_dprintf("false (CurrentLA < QueueLA)\n"); return false; } -# if 0 /* this code is reported to cause oscillation around RefuseLA */ - if (CurrentLA >= RefuseLA && QueueLA < RefuseLA) - { - if (tTd(3, 30)) - sm_dprintf("TRUE (CurrentLA >= RefuseLA)\n"); - return true; - } -# endif /* 0 */ rval = pri > (QueueFactor / (CurrentLA - QueueLA + 1)); if (tTd(3, 30)) sm_dprintf("%s (by calculation)\n", rval ? "true" : "false"); return rval; } + /* ** REFUSECONNECTIONS -- decide if connections should be refused ** ** Parameters: -** name -- daemon name (for error messages only) ** e -- the current envelope. -** d -- number of daemon +** dn -- number of daemon. ** active -- was this daemon actually active? ** ** Returns: @@ -2241,16 +2170,16 @@ shouldqueue(pri, ct) */ bool -refuseconnections(name, e, d, active) - char *name; +refuseconnections(e, dn, active) ENVELOPE *e; - int d; + int dn; bool active; { static time_t lastconn[MAXDAEMONS]; static int conncnt[MAXDAEMONS]; static time_t firstrejtime[MAXDAEMONS]; static time_t nextlogtime[MAXDAEMONS]; + int limit; #if _FFR_MEMSTAT long memfree; #endif /* _FFR_MEMSTAT */ @@ -2260,8 +2189,8 @@ refuseconnections(name, e, d, active) return true; #endif /* XLA */ - SM_ASSERT(d >= 0); - SM_ASSERT(d < MAXDAEMONS); + SM_ASSERT(dn >= 0); + SM_ASSERT(dn < MAXDAEMONS); if (ConnRateThrottle > 0) { time_t now; @@ -2269,25 +2198,27 @@ refuseconnections(name, e, d, active) now = curtime(); if (active) { - if (now != lastconn[d]) + if (now != lastconn[dn]) { - lastconn[d] = now; - conncnt[d] = 1; + lastconn[dn] = now; + conncnt[dn] = 1; } - else if (conncnt[d]++ > ConnRateThrottle) + else if (conncnt[dn]++ > ConnRateThrottle) { #define D_MSG_CRT "deferring connections on daemon %s: %d per second" /* sleep to flatten out connection load */ sm_setproctitle(true, e, D_MSG_CRT, - name, ConnRateThrottle); + Daemons[dn].d_name, + ConnRateThrottle); if (LogLevel > 8) sm_syslog(LOG_INFO, NOQID, D_MSG_CRT, - name, ConnRateThrottle); + Daemons[dn].d_name, + ConnRateThrottle); (void) sleep(1); } } - else if (now != lastconn[d]) - conncnt[d] = 0; + else if (now != lastconn[dn]) + conncnt[dn] = 0; } @@ -2297,40 +2228,47 @@ refuseconnections(name, e, d, active) memfree < RefuseLowMem) { # define R_MSG_LM "rejecting connections on daemon %s: free memory: %ld" - sm_setproctitle(true, e, R_MSG_LM, name, memfree); + sm_setproctitle(true, e, R_MSG_LM, Daemons[dn].d_name, memfree); if (LogLevel > 8) - sm_syslog(LOG_NOTICE, NOQID, R_MSG_LM, name, memfree); + sm_syslog(LOG_NOTICE, NOQID, R_MSG_LM, + Daemons[dn].d_name, memfree); return true; } #endif /* _FFR_MEMSTAT */ sm_getla(); - if (RefuseLA > 0 && CurrentLA >= RefuseLA) + limit = (Daemons[dn].d_refuseLA != DPO_NOTSET) ? + Daemons[dn].d_refuseLA : RefuseLA; + if (limit > 0 && CurrentLA >= limit) { time_t now; # define R_MSG_LA "rejecting connections on daemon %s: load average: %d" # define R2_MSG_LA "have been rejecting connections on daemon %s for %s" - sm_setproctitle(true, e, R_MSG_LA, name, CurrentLA); + sm_setproctitle(true, e, R_MSG_LA, Daemons[dn].d_name, + CurrentLA); if (LogLevel > 8) - sm_syslog(LOG_NOTICE, NOQID, R_MSG_LA, name, CurrentLA); + sm_syslog(LOG_NOTICE, NOQID, R_MSG_LA, + Daemons[dn].d_name, CurrentLA); now = curtime(); - if (firstrejtime[d] == 0) + if (firstrejtime[dn] == 0) { - firstrejtime[d] = now; - nextlogtime[d] = now + RejectLogInterval; + firstrejtime[dn] = now; + nextlogtime[dn] = now + RejectLogInterval; } - else if (nextlogtime[d] < now) + else if (nextlogtime[dn] < now) { - sm_syslog(LOG_ERR, NOQID, R2_MSG_LA, name, - pintvl(now - firstrejtime[d], true)); - nextlogtime[d] = now + RejectLogInterval; + sm_syslog(LOG_ERR, NOQID, R2_MSG_LA, Daemons[dn].d_name, + pintvl(now - firstrejtime[dn], true)); + nextlogtime[dn] = now + RejectLogInterval; } return true; } else - firstrejtime[d] = 0; + firstrejtime[dn] = 0; - if (DelayLA > 0 && CurrentLA >= DelayLA) + limit = (Daemons[dn].d_delayLA != DPO_NOTSET) ? + Daemons[dn].d_delayLA : DelayLA; + if (limit > 0 && CurrentLA >= limit) { time_t now; static time_t log_delay = (time_t) 0; @@ -2338,32 +2276,37 @@ refuseconnections(name, e, d, active) # define MIN_DELAY_LOG 90 /* wait before logging this again */ # define D_MSG_LA "delaying connections on daemon %s: load average=%d >= %d" /* sleep to flatten out connection load */ - sm_setproctitle(true, e, D_MSG_LA, name, DelayLA); + sm_setproctitle(true, e, D_MSG_LA, Daemons[dn].d_name, limit); if (LogLevel > 8 && (now = curtime()) > log_delay) { sm_syslog(LOG_INFO, NOQID, D_MSG_LA, - name, CurrentLA, DelayLA); + Daemons[dn].d_name, CurrentLA, limit); log_delay = now + MIN_DELAY_LOG; } (void) sleep(1); } - if (MaxChildren > 0 && CurChildren >= MaxChildren) + limit = (Daemons[dn].d_maxchildren != DPO_NOTSET) ? + Daemons[dn].d_maxchildren : MaxChildren; + if (limit > 0 && CurChildren >= limit) { proc_list_probe(); - if (CurChildren >= MaxChildren) + if (CurChildren >= limit) { #define R_MSG_CHILD "rejecting connections on daemon %s: %d children, max %d" sm_setproctitle(true, e, R_MSG_CHILD, - name, CurChildren, MaxChildren); + Daemons[dn].d_name, CurChildren, + limit); if (LogLevel > 8) sm_syslog(LOG_INFO, NOQID, R_MSG_CHILD, - name, CurChildren, MaxChildren); + Daemons[dn].d_name, CurChildren, + limit); return true; } } return false; } + /* ** SETPROCTITLE -- set process title for ps ** @@ -2492,7 +2435,7 @@ initsetproctitle(argc, argv, envp) { for (i = 0; envp[i] != NULL; i++) continue; - environ = (char **) xalloc(sizeof (char *) * (i + 1)); + environ = (char **) xalloc(sizeof(char *) * (i + 1)); for (i = 0; envp[i] != NULL; i++) environ[i] = newstr(envp[i]); environ[i] = NULL; @@ -2661,7 +2604,7 @@ sm_setproctitle(status, e, fmt, va_alist) /* print the argument string */ SM_VA_START(ap, fmt); - (void) sm_vsnprintf(buf, sizeof buf, fmt, ap); + (void) sm_vsnprintf(buf, sizeof(buf), fmt, ap); SM_VA_END(ap); if (status) @@ -2671,7 +2614,7 @@ sm_setproctitle(status, e, fmt, va_alist) { char prefix[SPT_BUFSIZE]; - expand(ProcTitlePrefix, prefix, sizeof prefix, e); + expand(ProcTitlePrefix, prefix, sizeof(prefix), e); setproctitle("%s: %s", prefix, buf); } else @@ -2889,7 +2832,7 @@ uname(name) char buf[MAXLINE]; while (sm_io_fgets(file, SM_TIME_DEFAULT, - buf, sizeof buf) != NULL) + buf, sizeof(buf)) != NULL) { if (sm_io_sscanf(buf, "#define sysname \"%*[^\"]\"", NODE_LENGTH, name->nodename) > 0) @@ -3263,7 +3206,7 @@ usershellok(user, shell) return false; } - while (sm_io_fgets(shellf, SM_TIME_DEFAULT, buf, sizeof buf) != NULL) + while (sm_io_fgets(shellf, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL) { register char *p, *q; @@ -3335,7 +3278,7 @@ usershellok(user, shell) long freediskspace(dir, bsize) - char *dir; + const char *dir; long *bsize; { # if SFS_TYPE == SFS_NONE @@ -3373,7 +3316,7 @@ freediskspace(dir, bsize) if (stat(dir, &statbuf) == 0 && ustat(statbuf.st_dev, &fs) == 0) # else /* SFS_TYPE == SFS_USTAT */ # if SFS_TYPE == SFS_4ARGS - if (statfs(dir, &fs, sizeof fs, 0) == 0) + if (statfs(dir, &fs, sizeof(fs), 0) == 0) # else /* SFS_TYPE == SFS_4ARGS */ # if SFS_TYPE == SFS_STATVFS if (statvfs(dir, &fs) == 0) @@ -3578,7 +3521,7 @@ lockfile(fd, filename, ext, type) if (ext == NULL) ext = ""; - memset(&lfd, '\0', sizeof lfd); + memset(&lfd, '\0', sizeof(lfd)); if (bitset(LOCK_UN, type)) lfd.l_type = F_UNLCK; else if (bitset(LOCK_EX, type)) @@ -3943,11 +3886,8 @@ vendor_post_defaults(e) ENVELOPE *e; { #ifdef __QNX__ - char *p; - /* Makes sure the SOCK environment variable remains */ - if (p = getextenv("SOCK")) - sm_setuserenv("SOCK", p); + sm_setuserenv("SOCK", NULL); #endif /* __QNX__ */ #if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) sun_post_defaults(e); @@ -4043,7 +3983,7 @@ validate_connection(sap, hostname, e) connection_rate_check(sap, e); if (rscheck("check_relay", hostname, anynet_ntoa(sap), - e, RSF_RMCOMM|RSF_COUNT, 3, NULL, NOQID) != EX_OK) + e, RSF_RMCOMM|RSF_COUNT, 3, NULL, NOQID, NULL) != EX_OK) { static char reject[BUFSIZ*2]; extern char MsgBuf[]; @@ -4052,9 +3992,9 @@ validate_connection(sap, hostname, e) sm_dprintf(" ... validate_connection: BAD (rscheck)\n"); if (strlen(MsgBuf) >= 3) - (void) sm_strlcpy(reject, MsgBuf, sizeof reject); + (void) sm_strlcpy(reject, MsgBuf, sizeof(reject)); else - (void) sm_strlcpy(reject, "Access denied", sizeof reject); + (void) sm_strlcpy(reject, "Access denied", sizeof(reject)); return reject; } @@ -4371,12 +4311,12 @@ sm_gethostbyname(name, family) if (nmaps >= 0) { /* try short name */ - if (strlen(name) > sizeof hbuf - 1) + if (strlen(name) > sizeof(hbuf) - 1) { errno = save_errno; return NULL; } - (void) sm_strlcpy(hbuf, name, sizeof hbuf); + (void) sm_strlcpy(hbuf, name, sizeof(hbuf)); (void) shorten_hostname(hbuf); /* if it hasn't been shortened, there's no point */ @@ -4428,7 +4368,7 @@ sm_gethostbyname(name, family) memmove(&ia6, h->h_addr_list[i], IN6ADDRSZ); addr = anynet_ntop(&ia6, - buf6, sizeof buf6); + buf6, sizeof(buf6)); #else /* NETINET6 */ memmove(&ia, h->h_addr_list[i], INADDRSZ); @@ -4667,7 +4607,8 @@ add_hostnames(sa) if (tTd(0, 4)) sm_dprintf("\ta.k.a.: %s\n", hp->h_name); - if (sm_snprintf(hnb, sizeof hnb, "[%s]", hp->h_name) < sizeof hnb + if (sm_snprintf(hnb, sizeof(hnb), "[%s]", hp->h_name) < + sizeof(hnb) && !wordinclass((char *) hnb, 'w')) setclass('w', hnb); } @@ -4685,8 +4626,8 @@ add_hostnames(sa) setclass('w', *ha); if (tTd(0, 4)) sm_dprintf("\ta.k.a.: %s\n", *ha); - if (sm_snprintf(hnb, sizeof hnb, - "[%s]", *ha) < sizeof hnb && + if (sm_snprintf(hnb, sizeof(hnb), + "[%s]", *ha) < sizeof(hnb) && !wordinclass((char *) hnb, 'w')) setclass('w', hnb); } @@ -4799,7 +4740,7 @@ load_if_names() return; } - len = lifc.lifc_len = numifs * sizeof (struct lifreq); + len = lifc.lifc_len = numifs * sizeof(struct lifreq); buf = lifc.lifc_buf = xalloc(lifc.lifc_len); # ifndef __hpux lifc.lifc_family = AF_UNSPEC; @@ -4856,20 +4797,20 @@ load_if_names() ** don't try to use it. */ - if ((len - i) < sizeof *ifr) + if ((len - i) < sizeof(*ifr)) break; # ifdef BSD4_4_SOCKADDR - if (sa->sa.sa_len > sizeof ifr->lifr_addr) - i += sizeof ifr->lifr_name + sa->sa.sa_len; + if (sa->sa.sa_len > sizeof(ifr->lifr_addr)) + i += sizeof(ifr->lifr_name) + sa->sa.sa_len; else # endif /* BSD4_4_SOCKADDR */ # ifdef DEC /* fix for IPv6 size differences */ - i += sizeof ifr->ifr_name + + i += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len); # else /* DEC */ - i += sizeof *ifr; + i += sizeof(*ifr); # endif /* DEC */ if (tTd(0, 20)) @@ -4923,18 +4864,18 @@ load_if_names() ia6 = sa->sin6.sin6_addr; if (IN6_IS_ADDR_UNSPECIFIED(&ia6)) { - addr = anynet_ntop(&ia6, buf6, sizeof buf6); + addr = anynet_ntop(&ia6, buf6, sizeof(buf6)); message("WARNING: interface %s is UP with %s address", name, addr == NULL ? "(NULL)" : addr); continue; } /* save IP address in text from */ - addr = anynet_ntop(&ia6, buf6, sizeof buf6); + addr = anynet_ntop(&ia6, buf6, sizeof(buf6)); if (addr != NULL) - (void) sm_snprintf(ip_addr, sizeof ip_addr, + (void) sm_snprintf(ip_addr, sizeof(ip_addr), "[%.*s]", - (int) sizeof ip_addr - 3, + (int) sizeof(ip_addr) - 3, addr); break; @@ -4949,8 +4890,8 @@ load_if_names() } /* save IP address in text from */ - (void) sm_snprintf(ip_addr, sizeof ip_addr, "[%.*s]", - (int) sizeof ip_addr - 3, inet_ntoa(ia)); + (void) sm_snprintf(ip_addr, sizeof(ip_addr), "[%.*s]", + (int) sizeof(ip_addr) - 3, inet_ntoa(ia)); break; } @@ -5006,7 +4947,7 @@ load_if_names() (void) close(s); return; } - ifc.ifc_len = numifs * sizeof (struct ifreq); + ifc.ifc_len = numifs * sizeof(struct ifreq); ifc.ifc_buf = xalloc(ifc.ifc_len); if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) { @@ -5045,15 +4986,15 @@ load_if_names() ** don't try to use it. */ - if ((ifc.ifc_len - i) < sizeof *ifr) + if ((ifc.ifc_len - i) < sizeof(*ifr)) break; # ifdef BSD4_4_SOCKADDR - if (sa->sa.sa_len > sizeof ifr->ifr_addr) - i += sizeof ifr->ifr_name + sa->sa.sa_len; + if (sa->sa.sa_len > sizeof(ifr->ifr_addr)) + i += sizeof(ifr->ifr_name) + sa->sa.sa_len; else # endif /* BSD4_4_SOCKADDR */ - i += sizeof *ifr; + i += sizeof(*ifr); if (tTd(0, 20)) sm_dprintf("%s\n", anynet_ntoa(sa)); @@ -5098,8 +5039,8 @@ load_if_names() } /* save IP address in text from */ - (void) sm_snprintf(ip_addr, sizeof ip_addr, "[%.*s]", - (int) sizeof ip_addr - 3, + (void) sm_snprintf(ip_addr, sizeof(ip_addr), "[%.*s]", + (int) sizeof(ip_addr) - 3, inet_ntoa(ia)); break; @@ -5122,7 +5063,7 @@ load_if_names() ia6 = sa->sin6.sin6_addr; if (IN6_IS_ADDR_UNSPECIFIED(&ia6)) { - addr = anynet_ntop(&ia6, buf6, sizeof buf6); + addr = anynet_ntop(&ia6, buf6, sizeof(buf6)); message("WARNING: interface %s is UP with %s address", ifr->ifr_name, addr == NULL ? "(NULL)" : addr); @@ -5130,11 +5071,11 @@ load_if_names() } /* save IP address in text from */ - addr = anynet_ntop(&ia6, buf6, sizeof buf6); + addr = anynet_ntop(&ia6, buf6, sizeof(buf6)); if (addr != NULL) - (void) sm_snprintf(ip_addr, sizeof ip_addr, + (void) sm_snprintf(ip_addr, sizeof(ip_addr), "[%.*s]", - (int) sizeof ip_addr - 3, + (int) sizeof(ip_addr) - 3, addr); break; @@ -5213,7 +5154,7 @@ get_num_procs_online() mib[0] = CTL_HW; mib[1] = HW_NCPU; - sz = (size_t) sizeof nproc; + sz = (size_t) sizeof(nproc); (void) sysctl(mib, 2, &nproc, &sz, NULL, 0); # endif /* defined(CTL_HW) && defined(HW_NCPU) */ #else /* USESYSCTL */ @@ -5389,7 +5330,7 @@ sm_syslog(level, id, fmt, va_alist) idlen = strlen(id) + SyslogPrefixLen; buf = buf0; - bufsize = sizeof buf0; + bufsize = sizeof(buf0); for (;;) { @@ -5419,9 +5360,19 @@ sm_syslog(level, id, fmt, va_alist) { #if LOG if (*id == '\0') - syslog(level, "%s", newstring); + { + if (tTd(89, 8)) + sm_dprintf("%s\n", newstring); + else + syslog(level, "%s", newstring); + } else - syslog(level, "%s: %s", id, newstring); + { + if (tTd(89, 8)) + sm_dprintf("%s: %s\n", id, newstring); + else + syslog(level, "%s: %s", id, newstring); + } #else /* LOG */ /*XXX should do something more sensible */ if (*id == '\0') @@ -5473,7 +5424,10 @@ sm_syslog(level, id, fmt, va_alist) save = *end; *end = 0; #if LOG - syslog(level, "%s[%d]: %s ...", id, seq++, begin); + if (tTd(89, 8)) + sm_dprintf("%s[%d]: %s ...\n", id, seq++, begin); + else + syslog(level, "%s[%d]: %s ...", id, seq++, begin); #else /* LOG */ (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "%s[%d]: %s ...\n", id, seq++, begin); @@ -5482,20 +5436,31 @@ sm_syslog(level, id, fmt, va_alist) begin = end; } if (seq >= 999) + { #if LOG - syslog(level, "%s[%d]: log terminated, too many parts", - id, seq); + if (tTd(89, 8)) + sm_dprintf("%s[%d]: log terminated, too many parts\n", + id, seq); + else + syslog(level, "%s[%d]: log terminated, too many parts", + id, seq); #else /* LOG */ (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "%s[%d]: log terminated, too many parts\n", id, seq); #endif /* LOG */ + } else if (*begin != '\0') + { #if LOG - syslog(level, "%s[%d]: %s", id, seq, begin); + if (tTd(89, 8)) + sm_dprintf("%s[%d]: %s\n", id, seq, begin); + else + syslog(level, "%s[%d]: %s", id, seq, begin); #else /* LOG */ (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "%s[%d]: %s\n", id, seq, begin); #endif /* LOG */ + } if (buf != buf0) sm_free(buf); errno = save_errno; @@ -5534,7 +5499,7 @@ hard_syslog(pri, msg, va_alist) SM_VA_LOCAL_DECL SM_VA_START(ap, msg); - (void) sm_vsnprintf(buf, sizeof buf, msg, ap); + (void) sm_vsnprintf(buf, sizeof(buf), msg, ap); SM_VA_END(ap); for (i = MAXSYSLOGTRIES; --i >= 0 && syslog(pri, CAST "%s", buf) < 0; ) @@ -5792,6 +5757,9 @@ char *CompileOptions[] = #if SCANF "SCANF", #endif /* SCANF */ +#if SM_LDAP_ERROR_ON_MISSING_ARGS + "SM_LDAP_ERROR_ON_MISSING_ARGS", +#endif /* SM_LDAP_ERROR_ON_MISSING_ARGS */ #if SMTPDEBUG "SMTPDEBUG", #endif /* SMTPDEBUG */ @@ -5886,6 +5854,9 @@ char *OsCompileOptions[] = #if HASINITGROUPS "HASINITGROUPS", #endif /* HASINITGROUPS */ +#if HASLDAPGETALIASBYNAME + "HASLDAPGETALIASBYNAME", +#endif /* HASLDAPGETALIASBYNAME */ #if HASLSTAT "HASLSTAT", #endif /* HASLSTAT */ @@ -5958,6 +5929,9 @@ char *OsCompileOptions[] = #if O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL "LOCK_ON_OPEN", #endif /* O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL */ +#if MILTER_NO_NAGLE + "MILTER_NO_NAGLE ", +#endif /* MILTER_NO_NAGLE */ #if NEEDFSYNC "NEEDFSYNC", #endif /* NEEDFSYNC */ @@ -6060,22 +6034,10 @@ char *FFRCompileOptions[] = /* Better truncation of list of MX records for dns map. */ "_FFR_BESTMX_BETTER_TRUNCATION", #endif /* _FFR_BESTMX_BETTER_TRUNCATION */ -#if _FFR_BLOCK_PROXIES - /* - ** Try to deal with open HTTP proxies that are used to send spam - ** by recognizing some commands from them. - */ - - "_FFR_BLOCK_PROXIES", -#endif /* _FFR_BLOCK_PROXIES */ #if _FFR_CATCH_BROKEN_MTAS /* Deal with MTAs that send a reply during the DATA phase. */ "_FFR_CATCH_BROKEN_MTAS", #endif /* _FFR_CATCH_BROKEN_MTAS */ -#if _FFR_CHECK_EOM - /* Enable check_eom ruleset */ - "_FFR_CHECK_EOM", -#endif /* _FFR_CHECK_EOM */ #if _FFR_CHK_QUEUE /* Stricter checks about queue directory permissions. */ "_FFR_CHK_QUEUE", @@ -6084,10 +6046,6 @@ char *FFRCompileOptions[] = /* Don't try to send mail if its size exceeds SIZE= of server. */ "_FFR_CLIENT_SIZE", #endif /* _FFR_CLIENT_SIZE */ -#if _FFR_CONTROL_MSTAT - /* Extended daemon status. */ - "_FFR_CONTROL_MSTAT", -#endif /* _FFR_CONTROL_MSTAT */ #if _FFR_CRLPATH /* CRLPath; needs documentation; Al Smith */ "_FFR_CRLPATH", @@ -6109,27 +6067,11 @@ char *FFRCompileOptions[] = /* Problem noted by Anne Bennett of Concordia University */ "_FFR_DIGUNIX_SAFECHOWN", #endif /* _FFR_DIGUNIX_SAFECHOWN */ -#if _FFR_DM_PER_DAEMON - /* DeliveryMode per DaemonPortOptions: 'D' */ - "_FFR_DM_PER_DAEMON", -#endif /* _FFR_DM_PER_DAEMON */ #if _FFR_DNSMAP_ALIASABLE /* Allow dns map type to be used for aliases. */ /* Don Lewis of TDK */ "_FFR_DNSMAP_ALIASABLE", #endif /* _FFR_DNSMAP_ALIASABLE */ -#if _FFR_DNSMAP_BASE - /* Specify a "base" domain for DNS lookups. */ - "_FFR_DNSMAP_BASE", -#endif /* _FFR_DNSMAP_BASE */ -#if _FFR_DNSMAP_MULTI - /* Allow multiple return values for DNS map. */ - "_FFR_DNSMAP_MULTI", -# if _FFR_DNSMAP_MULTILIMIT - /* Limit number of return values for DNS map. */ - "_FFR_DNSMAP_MULTILIMIT", -# endif /* _FFR_DNSMAP_MULTILIMIT */ -#endif /* _FFR_DNSMAP_MULTI */ #if _FFR_DONTLOCKFILESFORREAD_OPTION /* Enable DontLockFilesForRead option. */ "_FFR_DONTLOCKFILESFORREAD_OPTION", @@ -6138,6 +6080,21 @@ char *FFRCompileOptions[] = /* Allow usernames with '.' */ "_FFR_DOTTED_USERNAMES", #endif /* _FFR_DOTTED_USERNAMES */ +#if _FFR_DPO_CS + /* + ** Make DaemonPortOptions case sensitive. + ** For some unknown reasons the code converted every option + ** to uppercase (first letter only, as that's the only one that + ** is actually checked). This prevented all new lower case options + ** from working... + ** The documentation doesn't say anything about case (in)sensitivity, + ** which means it should be case sensitive by default, + ** but it's not a good idea to change this within a patch release, + ** so let's delay this to 8.15. + */ + + "_FFR_DPO_CS", +#endif /* _FFR_DPO_CS */ #if _FFR_DROP_TRUSTUSER_WARNING /* ** Don't issue this warning: @@ -6147,10 +6104,27 @@ char *FFRCompileOptions[] = "_FFR_DROP_TRUSTUSER_WARNING", #endif /* _FFR_DROP_TRUSTUSER_WARNING */ +#if _FFR_EIGHT_BIT_ADDR_OK + /* EightBitAddrOK: allow 8-bit e-mail addresses */ + "_FFR_EIGHT_BIT_ADDR_OK", +#endif /* _FFR_EIGHT_BIT_ADDR_OK */ #if _FFR_EXTRA_MAP_CHECK /* perform extra checks on $( $) in R lines */ "_FFR_EXTRA_MAP_CHECK", #endif /* _FFR_EXTRA_MAP_CHECK */ +#if _FFR_GETHBN_ExFILE + /* + ** According to Motonori Nakamura some gethostbyname() + ** implementations (TurboLinux?) may (temporarily) fail + ** due to a lack of file discriptors. Enabling this FFR + ** will check errno for EMFILE and ENFILE and in case of a match + ** cause a temporary error instead of a permanent error. + ** The right solution is of course to file a bug against those + ** systems such that they actually set h_errno = TRY_AGAIN. + */ + + "_FFR_GETHBN_ExFILE", +#endif /* _FFR_GETHBN_ExFILE */ #if _FFR_FIX_DASHT /* ** If using -t, force not sending to argv recipients, even @@ -6167,10 +6141,6 @@ char *FFRCompileOptions[] = /* Generate a ORCPT DSN arg if not already provided */ "_FFR_GEN_ORCPT", #endif /* _FFR_GEN_ORCPT */ -#if _FFR_LOG_GREET_PAUSE - /* log time for greet_pause delay; from Nik Clayton */ - "_FFR_LOG_GREET_PAUSE", -#endif /* _FFR_LOG_GREET_PAUSE */ #if _FFR_GROUPREADABLEAUTHINFOFILE /* Allow group readable DefaultAuthInfo file. */ "_FFR_GROUPREADABLEAUTHINFOFILE", @@ -6184,14 +6154,6 @@ char *FFRCompileOptions[] = /* Peter Eriksson of Linkopings universitet */ "_FFR_HANDLE_ISO8859_GECOS", #endif /* _FFR_HANDLE_ISO8859_GECOS */ -#if _FFR_HDR_TYPE - /* Set 'h' in {addr_type} for headers. */ - "_FFR_HDR_TYPE", -#endif /* _FFR_HDR_TYPE */ -#if _FFR_HELONAME - /* option to set heloname; Nik Clayton of FreeBSD */ - "_FFR_HELONAME", -#endif /* _FFR_HELONAME */ #if _FFR_HPUX_NSSWITCH /* Use nsswitch on HP-UX */ "_FFR_HPUX_NSSWITCH", @@ -6220,14 +6182,6 @@ char *FFRCompileOptions[] = /* Randall S. Winchester of the University of Maryland */ "_FFR_MAX_FORWARD_ENTRIES", #endif /* _FFR_MAX_FORWARD_ENTRIES */ -#if _FFR_MAXKEY - /* increase key size for LDAP lookups, see conf.h */ - "_FFR_MAXKEY", -#endif /* _FFR_MAXKEY */ -#if _FFR_MAXNOOPCOMMANDS - /* runtime option for "MaxNOOPCommands" */ - "_FFR_MAXNOOPCOMMANDS", -#endif /* _FFR_MAXNOOPCOMMANDS */ #if _FFR_MAX_SLEEP_TIME /* Limit sleep(2) time in libsm/clock.c */ "_FFR_MAX_SLEEP_TIME", @@ -6236,16 +6190,35 @@ char *FFRCompileOptions[] = /* Check free memory */ "_FFR_MEMSTAT", #endif /* _FFR_MEMSTAT */ -#if _FFR_MILTER_NAGLE - /* milter: turn off Nagle ("cork" on Linux) */ - /* John Gardiner Myers of Proofpoint */ - "_FFR_MILTER_NAGLE ", -#endif /* _FFR_MILTER_NAGLE */ -#if _FFR_MILTER_NOHDR_RESP - /* milter: no response expected when sending headers */ - /* John Gardiner Myers of Proofpoint */ - "_FFR_MILTER_NOHDR_RESP", -#endif /* _FFR_MILTER_NOHDR_RESP */ +#if _FFR_MILTER_CHECK + "_FFR_MILTER_CHECK", +#endif /* _FFR_MILTER_CHECK */ +#if _FFR_MILTER_CONVERT_ALL_LF_TO_CRLF + /* + ** milter_body() uses the same conversion algorithm as putbody() + ** to translate the "local" df format (\n) to SMTP format (\r\n). + ** However, putbody() and mime8to7() use different conversion + ** algorithms. + ** If the input date does not follow the SMTP standard + ** (e.g., if it has "naked \r"s), then the output from putbody() + ** and mime8to7() will most likely be different. + ** By turning on this FFR milter_body() will try to "imitate" + ** mime8to7(). + ** Note: there is no (simple) way to deal with both conversions + ** in a consistent manner. Moreover, as the "GiGo" principle applies, + ** it's not really worth to fix it. + */ + + "_FFR_MILTER_CONVERT_ALL_LF_TO_CRLF", +#endif /* _FFR_MILTER_CONVERT_ALL_LF_TO_CRLF */ +#if _FFR_MILTER_CHECK_REJECTIONS_TOO + /* + ** Also send RCPTs that are rejected by check_rcpt to a milter + ** (if requested during option negotiation). + */ + + "_FFR_MILTER_CHECK_REJECTIONS_TOO", +#endif /* _FFR_MILTER_CHECK_REJECTIONS_TOO */ #if _FFR_MIME7TO8_OLD /* Old mime7to8 code, the new is broken for at least one example. */ "_FFR_MIME7TO8_OLD", @@ -6267,15 +6240,9 @@ char *FFRCompileOptions[] = /* log ntries=, from Nik Clayton of FreeBSD */ "_FFR_LOG_NTRIES", #endif /* _FFR_LOG_NTRIES */ -#if _FFR_PRIV_NOACTUALRECIPIENT - /* - ** PrivacyOptions=noactualrecipient stops sendmail from putting - ** X-Actual-Recipient lines in DSNs revealing the actual - ** account that addresses map to. Patch from Dan Harkless. - */ - - "_FFR_PRIV_NOACTUALRECIPIENT", -#endif /* _FFR_PRIV_NOACTUALRECIPIENT */ +#if _FFR_QF_PARANOIA + "_FFR_QF_PARANOIA", +#endif /* _FFR_QF_PARANOIA */ #if _FFR_QUEUEDELAY /* Exponential queue delay; disabled in 8.13 since it isn't used. */ "_FFR_QUEUEDELAY", @@ -6314,10 +6281,6 @@ char *FFRCompileOptions[] = /* Random shuffle for queue sorting. */ "_FFR_RHS", #endif /* _FFR_RHS */ -#if _FFR_SELECT_SHM - /* Auto-select of shared memory key */ - "_FFR_SELECT_SHM", -#endif /* _FFR_SELECT_SHM */ #if _FFR_SHM_STATUS /* Donated code (unused). */ "_FFR_SHM_STATUS", @@ -6349,10 +6312,6 @@ char *FFRCompileOptions[] = /* Use select(2) in libsm/clock.c to emulate sleep(2) */ "_FFR_SLEEP_USE_SELECT ", #endif /* _FFR_SLEEP_USE_SELECT */ -#if _FFR_SOFT_BOUNCE - /* Turn all errors into temporary errors. */ - "_FFR_SOFT_BOUNCE", -#endif /* _FFR_SOFT_BOUNCE */ #if _FFR_SPT_ALIGN /* ** It looks like the Compaq Tru64 5.1A now aligns argv and envp to 64 diff --git a/contrib/sendmail/src/conf.h b/contrib/sendmail/src/conf.h index ab23bcaec12a..99ed47dfe188 100644 --- a/contrib/sendmail/src/conf.h +++ b/contrib/sendmail/src/conf.h @@ -10,7 +10,7 @@ * the sendmail distribution. * * - * $Id: conf.h,v 8.570 2005/12/09 18:37:27 ca Exp $ + * $Id: conf.h,v 8.574 2006/11/29 00:36:06 ca Exp $ * * $FreeBSD$ * @@ -63,6 +63,11 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */ **********************************************************************/ #define MAXLINE 2048 /* max line length */ +#if SASL +# define MAXINPLINE 12288 /* max input line length (for AUTH) */ +#else /* SASL */ +# define MAXINPLINE MAXLINE /* max input line length */ +#endif /* SASL */ #define MAXNAME 256 /* max length of a name */ #ifndef MAXAUTHINFO # define MAXAUTHINFO 100 /* max length of authinfo token */ @@ -74,11 +79,7 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */ #define MAXMXHOSTS 100 /* max # of MX records for one host */ #define SMTPLINELIM 990 /* max SMTP line length */ #define MAXUDBKEY 128 /* max size of a database key (udb only) */ -#if _FFR_MAXKEY -# define MAXKEY 1024 /* max size of a database key */ -#else /* _FFR_MAXKEY */ -# define MAXKEY (MAXNAME + 1) /* max size of a database key */ -#endif /* _FFR_MAXKEY */ +#define MAXKEY 1024 /* max size of a database key */ #define MEMCHUNKSIZE 1024 /* chunk size for memory allocation */ #define MAXUSERENVIRON 100 /* max envars saved, must be >= 3 */ #define MAXMAPSTACK 12 /* max # of stacked or sequenced maps */ diff --git a/contrib/sendmail/src/err.c b/contrib/sendmail/src/err.c index 5a0b5b1dfbaf..89b0736d67b1 100644 --- a/contrib/sendmail/src/err.c +++ b/contrib/sendmail/src/err.c @@ -9,11 +9,12 @@ * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. * + * $FreeBSD$ */ #include -SM_RCSID("@(#)$Id: err.c,v 8.191 2003/01/10 02:16:46 ca Exp $") +SM_RCSID("@(#)$Id: err.c,v 8.196 2006/11/10 23:14:08 ca Exp $") #if LDAPMAP # include @@ -109,7 +110,7 @@ fatal_error(exc) */ char MsgBuf[BUFSIZ*2]; /* text of most recent message */ -static char HeldMessageBuf[sizeof MsgBuf]; /* for held messages */ +static char HeldMessageBuf[sizeof(MsgBuf)]; /* for held messages */ #if NAMED_BIND && !defined(NO_DATA) # define NO_DATA NO_ADDRESS @@ -208,7 +209,7 @@ syserr(fmt, va_alist) else { user = ubuf; - (void) sm_snprintf(ubuf, sizeof ubuf, "UID%d", (int) RealUid); + (void) sm_snprintf(ubuf, sizeof(ubuf), "UID%d", (int) RealUid); } if (LogLevel > 0) @@ -320,9 +321,9 @@ usrerr(fmt, va_alist) { char buf[MAXLINE]; - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Postmaster warning: %.*s", - (int) sizeof buf - 22, errtxt); + (int) sizeof(buf) - 22, errtxt); CurEnv->e_message = sm_rpool_strdup_x(CurEnv->e_rpool, buf); } @@ -407,9 +408,9 @@ usrerrenh(enhsc, fmt, va_alist) { char buf[MAXLINE]; - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Postmaster warning: %.*s", - (int) sizeof buf - 22, errtxt); + (int) sizeof(buf) - 22, errtxt); CurEnv->e_message = sm_rpool_strdup_x(CurEnv->e_rpool, buf); } @@ -528,8 +529,7 @@ nmessage(msg, va_alist) case '5': if (CurEnv->e_rpool == NULL && CurEnv->e_message != NULL) sm_free(CurEnv->e_message); - CurEnv->e_message = - sm_rpool_strdup_x(CurEnv->e_rpool, errtxt); + CurEnv->e_message = sm_rpool_strdup_x(CurEnv->e_rpool, errtxt); break; } } @@ -558,8 +558,9 @@ putoutmsg(msg, holdmsg, heldmsg) bool holdmsg; bool heldmsg; { - char *errtxt = msg; char msgcode = msg[0]; + char *errtxt = msg; + char *id; /* display for debugging */ if (tTd(54, 8)) @@ -571,6 +572,7 @@ putoutmsg(msg, holdmsg, heldmsg) msg[0] = '5'; else if (msgcode == '8') msg[0] = '4'; + id = (CurEnv != NULL) ? CurEnv->e_id : NULL; /* output to transcript if serious */ if (!heldmsg && CurEnv != NULL && CurEnv->e_xfp != NULL && @@ -579,7 +581,7 @@ putoutmsg(msg, holdmsg, heldmsg) msg); if (LogLevel > 14 && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) - sm_syslog(LOG_INFO, CurEnv->e_id, + sm_syslog(LOG_INFO, id, "--- %s%s%s", msg, holdmsg ? " (hold)" : "", heldmsg ? " (held)" : ""); @@ -595,7 +597,7 @@ putoutmsg(msg, holdmsg, heldmsg) msg[0] = msgcode; if (HeldMessageBuf[0] == '5' && msgcode == '4') return; - (void) sm_strlcpy(HeldMessageBuf, msg, sizeof HeldMessageBuf); + (void) sm_strlcpy(HeldMessageBuf, msg, sizeof(HeldMessageBuf)); return; } @@ -650,7 +652,7 @@ putoutmsg(msg, holdmsg, heldmsg) /* can't call syserr, 'cause we are using MsgBuf */ HoldErrs = true; if (LogLevel > 0) - sm_syslog(LOG_CRIT, CurEnv->e_id, + sm_syslog(LOG_CRIT, id, "SYSERR: putoutmsg (%s): error on output channel sending \"%s\": %s", CURHOSTNAME, shortenstring(msg, MAXSHORTSTR), sm_errstring(errno)); @@ -823,7 +825,7 @@ fmtmsg(eb, to, num, enhsc, eno, fmt, ap) { char del; int l; - int spaceleft = sizeof MsgBuf; + int spaceleft = sizeof(MsgBuf); char *errtxt; /* output the reply code */ @@ -836,15 +838,13 @@ fmtmsg(eb, to, num, enhsc, eno, fmt, ap) del = '-'; else del = ' '; -#if _FFR_SOFT_BOUNCE if (SoftBounce && num[0] == '5') { /* replace 5 by 4 */ (void) sm_snprintf(eb, spaceleft, "4%2.2s%c", num + 1, del); } else -#endif /* _FFR_SOFT_BOUNCE */ - (void) sm_snprintf(eb, spaceleft, "%3.3s%c", num, del); + (void) sm_snprintf(eb, spaceleft, "%3.3s%c", num, del); eb += 4; spaceleft -= 4; @@ -866,13 +866,11 @@ fmtmsg(eb, to, num, enhsc, eno, fmt, ap) eb += l; spaceleft -= l; } -#if _FFR_SOFT_BOUNCE if (SoftBounce && eb[-l] == '5') { /* replace 5 by 4 */ eb[-l] = '4'; } -#endif /* _FFR_SOFT_BOUNCE */ errtxt = eb; /* output the file name and line number */ @@ -1006,7 +1004,7 @@ sm_errstring(errnum) err = strerror(errnum); if (err == NULL) { - (void) sm_snprintf(errbuf, sizeof errbuf, + (void) sm_snprintf(errbuf, sizeof(errbuf), "Error %d", errnum); err = errbuf; } @@ -1050,14 +1048,14 @@ sm_errstring(errnum) case EHOSTDOWN: if (CurHostName == NULL) break; - (void) sm_snprintf(buf, sizeof buf, "Host %s is down", + (void) sm_snprintf(buf, sizeof(buf), "Host %s is down", shortenstring(CurHostName, MAXSHORTSTR)); return buf; case ECONNREFUSED: if (CurHostName == NULL) break; - (void) sm_strlcpyn(buf, sizeof buf, 2, "Connection refused by ", + (void) sm_strlcpyn(buf, sizeof(buf), 2, "Connection refused by ", shortenstring(CurHostName, MAXSHORTSTR)); return buf; @@ -1127,7 +1125,7 @@ sm_errstring(errnum) if (dnsmsg != NULL) { bp = buf; - bp += sm_strlcpy(bp, "Name server: ", sizeof buf); + bp += sm_strlcpy(bp, "Name server: ", sizeof(buf)); if (CurHostName != NULL) { (void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2, @@ -1147,7 +1145,7 @@ sm_errstring(errnum) err = strerror(errnum); if (err == NULL) { - (void) sm_snprintf(buf, sizeof buf, "Error %d", errnum); + (void) sm_snprintf(buf, sizeof(buf), "Error %d", errnum); return buf; } return err; @@ -1155,7 +1153,7 @@ sm_errstring(errnum) if (errnum > 0 && errnum < sys_nerr) return sys_errlist[errnum]; - (void) sm_snprintf(buf, sizeof buf, "Error %d", errnum); + (void) sm_snprintf(buf, sizeof(buf), "Error %d", errnum); return buf; #endif /* HASSTRERROR */ } diff --git a/contrib/sendmail/src/headers.c b/contrib/sendmail/src/headers.c index 383a0533c0b7..7fc7873257fb 100644 --- a/contrib/sendmail/src/headers.c +++ b/contrib/sendmail/src/headers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2004, 2006 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2004, 2006, 2007 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,10 +13,11 @@ */ #include +#include -SM_RCSID("@(#)$Id: headers.c,v 8.291 2006/03/24 01:01:56 ca Exp $") +SM_RCSID("@(#)$Id: headers.c,v 8.310 2007/02/07 22:44:35 ca Exp $") -static HDR *allocheader __P((char *, char *, int, SM_RPOOL_T *)); +static HDR *allocheader __P((char *, char *, int, SM_RPOOL_T *, bool)); static size_t fix_mime_header __P((HDR *, ENVELOPE *)); static int priencode __P((char *)); static bool put_vanilla_header __P((HDR *, char *, MCI *)); @@ -44,10 +45,11 @@ setupheaders() s->s_header.hi_ruleset = NULL; } } + /* -** CHOMPHEADER -- process and save a header line. +** DOCHOMPHEADER -- process and save a header line. ** -** Called by collect, readcf, and readqf to deal with header lines. +** Called by chompheader. ** ** Parameters: ** line -- header as a text line. @@ -64,13 +66,14 @@ setupheaders() */ static struct hdrinfo NormalHeader = { NULL, 0, NULL }; +static unsigned long dochompheader __P((char *, int, HDR **, ENVELOPE *)); -unsigned long -chompheader(line, pflag, hdrp, e) +static unsigned long +dochompheader(line, pflag, hdrp, e) char *line; int pflag; HDR **hdrp; - register ENVELOPE *e; + ENVELOPE *e; { unsigned char mid = '\0'; register char *p; @@ -86,13 +89,6 @@ chompheader(line, pflag, hdrp, e) bool nullheader = false; BITMAP256 mopts; - if (tTd(31, 6)) - { - sm_dprintf("chompheader: "); - xputs(sm_debug_file(), line); - sm_dprintf("\n"); - } - headeronly = hdrp != NULL; if (!headeronly) hdrp = &e->e_header; @@ -188,10 +184,6 @@ chompheader(line, pflag, hdrp, e) return 0; } *fvalue = '\0'; - - /* strip field value on front */ - if (*p == ' ') - p++; fvalue = p; /* if the field is null, go ahead and use the default */ @@ -209,7 +201,7 @@ chompheader(line, pflag, hdrp, e) { char hbuf[50]; - (void) expand(fvalue, hbuf, sizeof hbuf, e); + (void) expand(fvalue, hbuf, sizeof(hbuf), e); for (p = hbuf; isascii(*p) && isspace(*p); ) p++; if ((*p++ & 0377) == CALLSUBR) @@ -357,9 +349,8 @@ chompheader(line, pflag, hdrp, e) macdefine(&e->e_macro, A_TEMP, macid("{hdr_name}"), fname); - (void) sm_snprintf(qval, sizeof qval, "%d", k); + (void) sm_snprintf(qval, sizeof(qval), "%d", k); macdefine(&e->e_macro, A_TEMP, macid("{hdrlen}"), qval); -#if _FFR_HDR_TYPE if (bitset(H_FROM, hi->hi_flags)) macdefine(&e->e_macro, A_PERM, macid("{addr_type}"), "h s"); @@ -367,11 +358,10 @@ chompheader(line, pflag, hdrp, e) macdefine(&e->e_macro, A_PERM, macid("{addr_type}"), "h r"); else -#endif /* _FFR_HDR_TYPE */ macdefine(&e->e_macro, A_PERM, macid("{addr_type}"), "h"); (void) rscheck(rs, fvalue, NULL, e, rscheckflags, 3, - NULL, e->e_id); + NULL, e->e_id, NULL); } } @@ -424,18 +414,18 @@ chompheader(line, pflag, hdrp, e) { /* copy conditions from default case */ memmove((char *) mopts, (char *) h->h_mflags, - sizeof mopts); + sizeof(mopts)); } h->h_macro = mid; } } /* create a new node */ - h = (HDR *) sm_rpool_malloc_x(e->e_rpool, sizeof *h); + h = (HDR *) sm_rpool_malloc_x(e->e_rpool, sizeof(*h)); h->h_field = sm_rpool_strdup_x(e->e_rpool, fname); h->h_value = sm_rpool_strdup_x(e->e_rpool, fvalue); h->h_link = NULL; - memmove((char *) h->h_mflags, (char *) mopts, sizeof mopts); + memmove((char *) h->h_mflags, (char *) mopts, sizeof(mopts)); h->h_macro = mid; *hp = h; h->h_flags = hi->hi_flags; @@ -461,25 +451,97 @@ chompheader(line, pflag, hdrp, e) return h->h_flags; } + +/* +** CHOMPHEADER -- process and save a header line. +** +** Called by collect, readcf, and readqf to deal with header lines. +** This is just a wrapper for dochompheader(). +** +** Parameters: +** line -- header as a text line. +** pflag -- flags for chompheader() (from sendmail.h) +** hdrp -- a pointer to the place to save the header. +** e -- the envelope including this header. +** +** Returns: +** flags for this header. +** +** Side Effects: +** The header is saved on the header list. +** Contents of 'line' are destroyed. +*/ + + +unsigned long +chompheader(line, pflag, hdrp, e) + char *line; + int pflag; + HDR **hdrp; + register ENVELOPE *e; +{ + unsigned long rval; + + if (tTd(31, 6)) + { + sm_dprintf("chompheader: "); + xputs(sm_debug_file(), line); + sm_dprintf("\n"); + } + + /* quote this if user (not config file) input */ + if (bitset(pflag, CHHDR_USER)) + { + char xbuf[MAXLINE]; + char *xbp = NULL; + int xbufs; + + xbufs = sizeof(xbuf); + xbp = quote_internal_chars(line, xbuf, &xbufs); + if (tTd(31, 7)) + { + sm_dprintf("chompheader: quoted: "); + xputs(sm_debug_file(), xbp); + sm_dprintf("\n"); + } + rval = dochompheader(xbp, pflag, hdrp, e); + if (xbp != xbuf) + sm_free(xbp); + } + else + rval = dochompheader(line, pflag, hdrp, e); + + return rval; +} + /* ** ALLOCHEADER -- allocate a header entry ** ** Parameters: -** field -- the name of the header field. -** value -- the value of the field. +** field -- the name of the header field (will not be copied). +** value -- the value of the field (will be copied). ** flags -- flags to add to h_flags. ** rp -- resource pool for allocations +** space -- add leading space? ** ** Returns: ** Pointer to a newly allocated and populated HDR. +** +** Notes: +** o field and value must be in internal format, i.e., +** metacharacters must be "quoted", see quote_internal_chars(). +** o maybe add more flags to decide: +** - what to copy (field/value) +** - whether to convert value to an internal format */ static HDR * -allocheader(field, value, flags, rp) +allocheader(field, value, flags, rp, space) char *field; char *value; int flags; SM_RPOOL_T *rp; + bool space; { HDR *h; STAB *s; @@ -488,9 +550,23 @@ allocheader(field, value, flags, rp) s = stab(field, ST_HEADER, ST_FIND); /* allocate space for new header */ - h = (HDR *) sm_rpool_malloc_x(rp, sizeof *h); + h = (HDR *) sm_rpool_malloc_x(rp, sizeof(*h)); h->h_field = field; - h->h_value = sm_rpool_strdup_x(rp, value); + if (space) + { + size_t l; + char *n; + + l = strlen(value); + SM_ASSERT(l + 2 > l); + n = sm_rpool_malloc_x(rp, l + 2); + n[0] = ' '; + n[1] = '\0'; + sm_strlcpy(n + 1, value, l + 1); + h->h_value = n; + } + else + h->h_value = sm_rpool_strdup_x(rp, value); h->h_flags = flags; if (s != NULL) h->h_flags |= s->s_header.hi_flags; @@ -499,30 +575,36 @@ allocheader(field, value, flags, rp) return h; } + /* ** ADDHEADER -- add a header entry to the end of the queue. ** ** This bypasses the special checking of chompheader. ** ** Parameters: -** field -- the name of the header field. -** value -- the value of the field. +** field -- the name of the header field (will not be copied). +** value -- the value of the field (will be copied). ** flags -- flags to add to h_flags. ** e -- envelope. +** space -- add leading space? ** ** Returns: ** none. ** ** Side Effects: ** adds the field on the list of headers for this envelope. +** +** Notes: field and value must be in internal format, i.e., +** metacharacters must be "quoted", see quote_internal_chars(). */ void -addheader(field, value, flags, e) +addheader(field, value, flags, e, space) char *field; char *value; int flags; ENVELOPE *e; + bool space; { register HDR *h; HDR **hp; @@ -536,41 +618,51 @@ addheader(field, value, flags, e) } /* allocate space for new header */ - h = allocheader(field, value, flags, e->e_rpool); + h = allocheader(field, value, flags, e->e_rpool, space); h->h_link = *hp; *hp = h; } + /* ** INSHEADER -- insert a header entry at the specified index -** ** This bypasses the special checking of chompheader. ** ** Parameters: ** idx -- index into the header list at which to insert -** field -- the name of the header field. -** value -- the value of the field. +** field -- the name of the header field (will be copied). +** value -- the value of the field (will be copied). ** flags -- flags to add to h_flags. ** e -- envelope. +** space -- add leading space? ** ** Returns: ** none. ** ** Side Effects: ** inserts the field on the list of headers for this envelope. +** +** Notes: +** - field and value must be in internal format, i.e., +** metacharacters must be "quoted", see quote_internal_chars(). +** - the header list contains headers that might not be +** sent "out" (see putheader(): "skip"), hence there is no +** reliable way to insert a header at an exact position +** (except at the front or end). */ void -insheader(idx, field, value, flags, e) +insheader(idx, field, value, flags, e, space) int idx; char *field; char *value; int flags; ENVELOPE *e; + bool space; { HDR *h, *srch, *last = NULL; /* allocate space for new header */ - h = allocheader(field, value, flags, e->e_rpool); + h = allocheader(field, value, flags, e->e_rpool, space); /* find insertion position */ for (srch = e->e_header; srch != NULL && idx > 0; @@ -594,6 +686,7 @@ insheader(idx, field, value, flags, e) srch->h_link = h; } } + /* ** HVALUE -- return value of a header. ** @@ -605,7 +698,7 @@ insheader(idx, field, value, flags, e) ** header -- the header list. ** ** Returns: -** pointer to the value part. +** pointer to the value part (internal format). ** NULL if not found. ** ** Side Effects: @@ -627,6 +720,7 @@ hvalue(field, header) } return NULL; } + /* ** ISHEADER -- predicate telling if argument is a header. ** @@ -654,8 +748,9 @@ bool isheader(h) char *h; { - register char *s = h; + char *s; + s = h; if (s[0] == '-' && s[1] == '-') return false; @@ -671,6 +766,7 @@ isheader(h) return (*s == ':'); } + /* ** EATHEADER -- run through the stored header and extract info. ** @@ -735,7 +831,7 @@ eatheader(e, full, log) for (h = e->e_header; h != NULL; h = h->h_link) { if (tTd(32, 1)) - sm_dprintf("%s: ", h->h_field); + sm_dprintf("%s:", h->h_field); if (h->h_value == NULL) { if (tTd(32, 1)) @@ -753,12 +849,13 @@ eatheader(e, full, log) xputs(sm_debug_file(), h->h_value); sm_dprintf(") "); } - expand(h->h_value, buf, sizeof buf, e); - if (buf[0] != '\0') + expand(h->h_value, buf, sizeof(buf), e); + if (buf[0] != '\0' && + (buf[0] != ' ' || buf[1] != '\0')) { if (bitset(H_FROM, h->h_flags)) expand(crackaddr(buf, e), - buf, sizeof buf, e); + buf, sizeof(buf), e); h->h_value = sm_rpool_strdup_x(e->e_rpool, buf); h->h_flags &= ~H_DEFAULT; } @@ -822,7 +919,7 @@ eatheader(e, full, log) if (hopcnt > e->e_hopcount) { e->e_hopcount = hopcnt; - (void) sm_snprintf(buf, sizeof buf, "%d", e->e_hopcount); + (void) sm_snprintf(buf, sizeof(buf), "%d", e->e_hopcount); macdefine(&e->e_macro, A_TEMP, 'c', buf); } @@ -853,7 +950,7 @@ eatheader(e, full, log) /* tokenize header */ oldsupr = SuprErrs; SuprErrs = true; - pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL, + pvp = prescan(p, '\0', pvpbuf, sizeof(pvpbuf), NULL, MimeTokenTab, false); SuprErrs = oldsupr; @@ -975,6 +1072,7 @@ eatheader(e, full, log) e->e_flags &= ~EF_LOGSENDER; } } + /* ** LOGSENDER -- log sender information ** @@ -1005,8 +1103,8 @@ logsender(e, msgid) size_t l; l = strlen(msgid); - if (l > sizeof mbuf - 1) - l = sizeof mbuf - 1; + if (l > sizeof(mbuf) - 1) + l = sizeof(mbuf) - 1; memmove(mbuf, msgid, l); mbuf[l] = '\0'; p = mbuf; @@ -1026,7 +1124,7 @@ logsender(e, msgid) else { name = hbuf; - (void) sm_snprintf(hbuf, sizeof hbuf, "%.80s", RealHostName); + (void) sm_snprintf(hbuf, sizeof(hbuf), "%.80s", RealHostName); if (RealHostAddr.sa.sa_family != 0) { p = &hbuf[strlen(hbuf)]; @@ -1105,6 +1203,7 @@ logsender(e, msgid) "%.400srelay=%s", sbuf, name); #endif /* (SYSLOG_BUFSIZE) >= 256 */ } + /* ** PRIENCODE -- encode external priority names into internal values. ** @@ -1133,6 +1232,7 @@ priencode(p) /* unknown priority */ return 0; } + /* ** CRACKADDR -- parse an address and turn it into a macro ** @@ -1215,17 +1315,22 @@ crackaddr(addr, e) if (tTd(33, 1)) sm_dprintf("crackaddr(%s)\n", addr); - /* strip leading spaces */ + buflim = bufend = &buf[sizeof(buf) - 1]; + bp = bufhead = buf; + + /* skip over leading spaces but preserve them */ while (*addr != '\0' && isascii(*addr) && isspace(*addr)) + { + SM_APPEND_CHAR(*addr); addr++; + } + bufhead = bp; /* ** Start by assuming we have no angle brackets. This will be ** adjusted later if we find them. */ - buflim = bufend = &buf[sizeof(buf) - 1]; - bp = bufhead = buf; p = addrhead = addr; copylev = anglelev = cmtlev = realcmtlev = 0; bracklev = 0; @@ -1533,6 +1638,7 @@ crackaddr(addr, e) } return buf; } + /* ** PUTHEADER -- put the header part of a message from the in-core copy ** @@ -1580,7 +1686,7 @@ putheader(mci, hdr, e, flags) if (tTd(34, 11)) { - sm_dprintf(" %s: ", h->h_field); + sm_dprintf(" %s:", h->h_field); xputs(sm_debug_file(), p); } @@ -1721,7 +1827,7 @@ putheader(mci, hdr, e, flags) if (bitset(H_DEFAULT, h->h_flags) || bitset(H_BINDLATE, h->h_flags)) { - expand(p, buf, sizeof buf, e); + expand(p, buf, sizeof(buf), e); p = buf; if (*p == '\0') { @@ -1742,7 +1848,7 @@ putheader(mci, hdr, e, flags) else { /* no other recipient headers: truncate value */ - (void) sm_strlcpyn(obuf, sizeof obuf, 2, + (void) sm_strlcpyn(obuf, sizeof(obuf), 2, h->h_field, ":"); if (!putline(obuf, mci)) goto writeerr; @@ -1786,7 +1892,7 @@ putheader(mci, hdr, e, flags) goto writeerr; if (hvalue("Content-Type", e->e_header) == NULL) { - (void) sm_snprintf(obuf, sizeof obuf, + (void) sm_snprintf(obuf, sizeof(obuf), "Content-Type: text/plain; charset=%s", defcharset(e)); if (!putline(obuf, mci)) @@ -1802,6 +1908,7 @@ putheader(mci, hdr, e, flags) writeerr: return false; } + /* ** PUT_VANILLA_HEADER -- output a fairly ordinary header ** @@ -1825,10 +1932,10 @@ put_vanilla_header(h, v, mci) int putflags; char obuf[MAXLINE + 256]; /* additional length for h_field */ - putflags = PXLF_HEADER; + putflags = PXLF_HEADER | PXLF_STRIPMQUOTE; if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags)) putflags |= PXLF_STRIP8BIT; - (void) sm_snprintf(obuf, sizeof obuf, "%.200s: ", h->h_field); + (void) sm_snprintf(obuf, sizeof(obuf), "%.200s:", h->h_field); obp = obuf + strlen(obuf); while ((nlp = strchr(v, '\n')) != NULL) { @@ -1861,6 +1968,7 @@ put_vanilla_header(h, v, mci) writeerr: return false; } + /* ** COMMAIZE -- output a header field, making a comma-translated list. ** @@ -1875,7 +1983,7 @@ put_vanilla_header(h, v, mci) ** true iff header field was written successfully ** ** Side Effects: -** outputs "p" to file "fp". +** outputs "p" to "mci". */ bool @@ -1887,10 +1995,9 @@ commaize(h, p, oldstyle, mci, e) register ENVELOPE *e; { register char *obp; - int opos; - int omax; + int opos, omax, spaces; bool firstone = true; - int putflags = PXLF_HEADER; + int putflags = PXLF_HEADER | PXLF_STRIPMQUOTE; char **res; char obuf[MAXLINE + 3]; @@ -1900,20 +2007,44 @@ commaize(h, p, oldstyle, mci, e) */ if (tTd(14, 2)) - sm_dprintf("commaize(%s: %s)\n", h->h_field, p); + sm_dprintf("commaize(%s:%s)\n", h->h_field, p); if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags)) putflags |= PXLF_STRIP8BIT; obp = obuf; - (void) sm_snprintf(obp, SPACELEFT(obuf, obp), "%.200s: ", - h->h_field); - - /* opos = strlen(obp); */ - opos = strlen(h->h_field) + 2; - if (opos > 202) - opos = 202; + (void) sm_snprintf(obp, SPACELEFT(obuf, obp), "%.200s:", h->h_field); + /* opos = strlen(obp); instead of the next 3 lines? */ + opos = strlen(h->h_field) + 1; + if (opos > 201) + opos = 201; obp += opos; + + spaces = 0; + while (*p != '\0' && isascii(*p) && isspace(*p)) + { + ++spaces; + ++p; + } + if (spaces > 0) + { + SM_ASSERT(sizeof(obuf) > opos * 2); + + /* + ** Restrict number of spaces to half the length of buffer + ** so the header field body can be put in here too. + ** Note: this is a hack... + */ + + if (spaces > sizeof(obuf) / 2) + spaces = sizeof(obuf) / 2; + (void) sm_snprintf(obp, SPACELEFT(obuf, obp), "%*s", spaces, + ""); + opos += spaces; + obp += spaces; + SM_ASSERT(obp < &obuf[MAXLINE]); + } + omax = mci->mci_mailer->m_linelimit - 2; if (omax < 0 || omax > 78) omax = 78; @@ -1949,7 +2080,7 @@ commaize(h, p, oldstyle, mci, e) char pvpbuf[PSBUFSIZE]; res = prescan(p, oldstyle ? ' ' : ',', pvpbuf, - sizeof pvpbuf, &oldp, NULL, false); + sizeof(pvpbuf), &oldp, ExtTokenTab, false); p = oldp; #if _FFR_IGNORE_BOGUS_ADDR /* ignore addresses that can't be parsed */ @@ -2027,7 +2158,7 @@ commaize(h, p, oldstyle, mci, e) if (!putxline(obuf, strlen(obuf), mci, putflags)) goto writeerr; obp = obuf; - (void) sm_strlcpy(obp, " ", sizeof obuf); + (void) sm_strlcpy(obp, " ", sizeof(obuf)); opos = strlen(obp); obp += opos; opos += strlen(name); @@ -2043,10 +2174,10 @@ commaize(h, p, oldstyle, mci, e) firstone = false; *p = savechar; } - if (obp < &obuf[sizeof obuf]) + if (obp < &obuf[sizeof(obuf)]) *obp = '\0'; else - obuf[sizeof obuf - 1] = '\0'; + obuf[sizeof(obuf) - 1] = '\0'; return putxline(obuf, strlen(obuf), mci, putflags); writeerr: @@ -2080,7 +2211,7 @@ copyheader(header, rpool) while (header != NULL) { - newhdr = (HDR *) sm_rpool_malloc_x(rpool, sizeof *newhdr); + newhdr = (HDR *) sm_rpool_malloc_x(rpool, sizeof(*newhdr)); STRUCTCOPY(*header, *newhdr); *tail = newhdr; tail = &newhdr->h_link; @@ -2090,6 +2221,7 @@ copyheader(header, rpool) return ret; } + /* ** FIX_MIME_HEADER -- possibly truncate/rebalance parameters in a MIME header ** diff --git a/contrib/sendmail/src/mailq.1 b/contrib/sendmail/src/mailq.1 index f67a9ddf99a0..6b2136f6e3ef 100644 --- a/contrib/sendmail/src/mailq.1 +++ b/contrib/sendmail/src/mailq.1 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998-2000, 2002 Sendmail, Inc. and its suppliers. +.\" Copyright (c) 1998-2000, 2002, 2007 Sendmail, Inc. and its suppliers. .\" All rights reserved. .\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved. .\" Copyright (c) 1985, 1990, 1993 @@ -9,9 +9,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: mailq.1,v 8.20 2002/06/27 22:47:34 gshapiro Exp $ +.\" $Id: mailq.1,v 8.21 2007/03/22 18:21:27 ca Exp $ .\" -.TH MAILQ 1 "$Date: 2002/06/27 22:47:34 $" +.TH MAILQ 1 "$Date: 2007/03/22 18:21:27 $" .SH NAME mailq \- print the mail queue @@ -104,6 +104,25 @@ and the name of the alias this command expanded from, if any. Moreover, status messages for each recipient are printed if available. .PP +Several sendmail.cf options influence the behavior of the +.B mailq +utility: +The number of items printed per queue group is restricted by +.B MaxQueueRunSize +if that value is set. +The status character +.B * +is not printed for some values of +.B QueueSortOrder, +e.g., +filename, +random, +modification, and +none, +unless a +.B -q +option is used to limit the processed jobs. +.PP The .B mailq utility exits 0 on success, and >0 if an error occurs. @@ -114,3 +133,4 @@ The .B mailq command appeared in 4.0BSD. +.\" $FreeBSD$ diff --git a/contrib/sendmail/src/mci.c b/contrib/sendmail/src/mci.c index 17263791407c..ef977440c8ed 100644 --- a/contrib/sendmail/src/mci.c +++ b/contrib/sendmail/src/mci.c @@ -14,7 +14,7 @@ #include -SM_RCSID("@(#)$Id: mci.c,v 8.217 2006/04/18 01:27:36 ca Exp $") +SM_RCSID("@(#)$Id: mci.c,v 8.218 2006/08/15 23:24:57 ca Exp $") #if NETINET || NETINET6 # include @@ -141,8 +141,8 @@ mci_scan(savemci) if (MciCache == NULL) { /* first call */ - MciCache = (MCI **) sm_pmalloc_x(MaxMciCache * sizeof *MciCache); - memset((char *) MciCache, '\0', MaxMciCache * sizeof *MciCache); + MciCache = (MCI **) sm_pmalloc_x(MaxMciCache * sizeof(*MciCache)); + memset((char *) MciCache, '\0', MaxMciCache * sizeof(*MciCache)); return &MciCache[0]; } @@ -310,7 +310,7 @@ mci_get(host, m) extern SOCKADDR CurHostAddr; /* clear CurHostAddr so we don't get a bogus address with this name */ - memset(&CurHostAddr, '\0', sizeof CurHostAddr); + memset(&CurHostAddr, '\0', sizeof(CurHostAddr)); /* clear out any expired connections */ (void) mci_scan(NULL); @@ -375,7 +375,7 @@ mci_get(host, m) { /* get peer host address */ /* (this should really be in the mci struct) */ - SOCKADDR_LEN_T socklen = sizeof CurHostAddr; + SOCKADDR_LEN_T socklen = sizeof(CurHostAddr); (void) getpeername(sm_io_getinfo(mci->mci_in, SM_IO_WHAT_FD, NULL), @@ -465,10 +465,10 @@ mci_new(rpool) register MCI *mci; if (rpool == NULL) - mci = (MCI *) sm_malloc_x(sizeof *mci); + mci = (MCI *) sm_malloc_x(sizeof(*mci)); else - mci = (MCI *) sm_rpool_malloc_x(rpool, sizeof *mci); - memset((char *) mci, '\0', sizeof *mci); + mci = (MCI *) sm_rpool_malloc_x(rpool, sizeof(*mci)); + memset((char *) mci, '\0', sizeof(*mci)); mci->mci_rpool = sm_rpool_new_x(NULL); mci->mci_macro.mac_rpool = mci->mci_rpool; return mci; @@ -727,7 +727,7 @@ mci_lock_host_statfile(mci) sm_dprintf("mci_lock_host: attempting to lock %s\n", mci->mci_host); - if (mci_generate_persistent_path(mci->mci_host, fname, sizeof fname, + if (mci_generate_persistent_path(mci->mci_host, fname, sizeof(fname), true) < 0) { /* of course this should never happen */ @@ -857,7 +857,7 @@ mci_load_persistent(mci) sm_dprintf("mci_load_persistent: Attempting to load persistent information for %s\n", mci->mci_host); - if (mci_generate_persistent_path(mci->mci_host, fname, sizeof fname, + if (mci_generate_persistent_path(mci->mci_host, fname, sizeof(fname), false) < 0) { /* Not much we can do if the file isn't there... */ @@ -946,7 +946,7 @@ mci_read_persistent(fp, mci) sm_io_rewind(fp, SM_TIME_DEFAULT); ver = -1; LineNumber = 0; - while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf, sizeof buf) != NULL) + while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL) { LineNumber++; p = strchr(buf, '\n'); @@ -1171,7 +1171,7 @@ mci_traverse_persistent(action, pathname) continue; (void) sm_strlcpy(newptr, e->d_name, - sizeof newpath - + sizeof(newpath) - (newptr - newpath)); if (StopRequest) @@ -1301,7 +1301,7 @@ mci_print_persistent(pathname, hostname) } FileName = pathname; - memset(&mcib, '\0', sizeof mcib); + memset(&mcib, '\0', sizeof(mcib)); if (mci_read_persistent(fp, &mcib) < 0) { syserr("%s: could not read status file", pathname); @@ -1333,7 +1333,7 @@ mci_print_persistent(pathname, hostname) { char buf[80]; - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Unknown mailer error %d", mcib.mci_exitstat); (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%.*s\n", @@ -1480,12 +1480,12 @@ mci_generate_persistent_path(host, path, pathlen, createflag) return -1; /* make certain this is not a bracketed host number */ - if (strlen(host) > sizeof t_host - 1) + if (strlen(host) > sizeof(t_host) - 1) return -1; if (host[0] == '[') - (void) sm_strlcpy(t_host, host + 1, sizeof t_host); + (void) sm_strlcpy(t_host, host + 1, sizeof(t_host)); else - (void) sm_strlcpy(t_host, host, sizeof t_host); + (void) sm_strlcpy(t_host, host, sizeof(t_host)); /* ** Delete any trailing dots from the hostname. diff --git a/contrib/sendmail/src/savemail.c b/contrib/sendmail/src/savemail.c index 8010b31d9df0..7c7f288b8599 100644 --- a/contrib/sendmail/src/savemail.c +++ b/contrib/sendmail/src/savemail.c @@ -15,7 +15,7 @@ #include -SM_RCSID("@(#)$Id: savemail.c,v 8.308 2006/04/18 01:31:33 ca Exp $") +SM_RCSID("@(#)$Id: savemail.c,v 8.313 2006/11/29 00:20:41 ca Exp $") static bool errbody __P((MCI *, ENVELOPE *, char *)); static bool pruneroute __P((char *)); @@ -195,7 +195,7 @@ savemail(e, sendbody) break; } - expand("\201n", buf, sizeof buf, e); + expand("\201n", buf, sizeof(buf), e); (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\r\nMessage from %s...\r\n", buf); (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, @@ -206,7 +206,7 @@ savemail(e, sendbody) (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "Transcript follows:\r\n"); while (sm_io_fgets(e->e_xfp, SM_TIME_DEFAULT, - buf, sizeof buf) != NULL && + buf, sizeof(buf)) != NULL && !sm_io_error(smioout)) (void) sm_io_fputs(smioout, SM_TIME_DEFAULT, @@ -253,7 +253,7 @@ savemail(e, sendbody) char from[TOBUFSIZE]; if (sm_strlcpy(from, e->e_from.q_paddr, - sizeof from) >= sizeof from) + sizeof(from)) >= sizeof(from)) { state = ESM_POSTMASTER; break; @@ -307,7 +307,7 @@ savemail(e, sendbody) */ q = NULL; - expand(DoubleBounceAddr, buf, sizeof buf, e); + expand(DoubleBounceAddr, buf, sizeof(buf), e); /* ** Just drop it on the floor if DoubleBounceAddr @@ -373,7 +373,7 @@ savemail(e, sendbody) p = macvalue('g', e); macdefine(&e->e_macro, A_PERM, 'g', e->e_sender); - expand("\201z/dead.letter", dlbuf, sizeof dlbuf, e); + expand("\201z/dead.letter", dlbuf, sizeof(dlbuf), e); sff = SFF_CREAT|SFF_REGONLY|SFF_RUNASREALUID; if (RealUid == 0) sff |= SFF_ROOTOK; @@ -424,7 +424,7 @@ savemail(e, sendbody) break; } - memset(&mcibuf, '\0', sizeof mcibuf); + memset(&mcibuf, '\0', sizeof(mcibuf)); mcibuf.mci_out = fp; mcibuf.mci_mailer = FileMailer; if (bitnset(M_7BITS, FileMailer->m_flags)) @@ -608,7 +608,7 @@ returntosender(msg, returnq, flags, e) ee->e_nrcpts++; if (q->q_alias == NULL) - addheader("To", q->q_paddr, 0, ee); + addheader("To", q->q_paddr, 0, ee, true); } if (LogLevel > 5) @@ -627,18 +627,18 @@ returntosender(msg, returnq, flags, e) if (SendMIMEErrors) { - addheader("MIME-Version", "1.0", 0, ee); - (void) sm_snprintf(buf, sizeof buf, "%s.%ld/%.100s", + addheader("MIME-Version", "1.0", 0, ee, true); + (void) sm_snprintf(buf, sizeof(buf), "%s.%ld/%.100s", ee->e_id, (long)curtime(), MyHostName); ee->e_msgboundary = sm_rpool_strdup_x(ee->e_rpool, buf); - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), #if DSN "multipart/report; report-type=delivery-status;\n\tboundary=\"%s\"", #else /* DSN */ "multipart/mixed; boundary=\"%s\"", #endif /* DSN */ ee->e_msgboundary); - addheader("Content-Type", buf, 0, ee); + addheader("Content-Type", buf, 0, ee, true); p = hvalue("Content-Transfer-Encoding", e->e_header); if (p != NULL && sm_strcasecmp(p, "binary") != 0) @@ -646,42 +646,42 @@ returntosender(msg, returnq, flags, e) if (p == NULL && bitset(EF_HAS8BIT, e->e_flags)) p = "8bit"; if (p != NULL) - addheader("Content-Transfer-Encoding", p, 0, ee); + addheader("Content-Transfer-Encoding", p, 0, ee, true); } if (strncmp(msg, "Warning:", 8) == 0) { - addheader("Subject", msg, 0, ee); + addheader("Subject", msg, 0, ee, true); p = "warning-timeout"; } else if (strncmp(msg, "Postmaster warning:", 19) == 0) { - addheader("Subject", msg, 0, ee); + addheader("Subject", msg, 0, ee, true); p = "postmaster-warning"; } else if (strcmp(msg, "Return receipt") == 0) { - addheader("Subject", msg, 0, ee); + addheader("Subject", msg, 0, ee, true); p = "return-receipt"; } else if (bitset(RTSF_PM_BOUNCE, flags)) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Postmaster notify: see transcript for details"); - addheader("Subject", buf, 0, ee); + addheader("Subject", buf, 0, ee, true); p = "postmaster-notification"; } else { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Returned mail: see transcript for details"); - addheader("Subject", buf, 0, ee); + addheader("Subject", buf, 0, ee, true); p = "failure"; } - (void) sm_snprintf(buf, sizeof buf, "auto-generated (%s)", p); - addheader("Auto-Submitted", buf, 0, ee); + (void) sm_snprintf(buf, sizeof(buf), "auto-generated (%s)", p); + addheader("Auto-Submitted", buf, 0, ee, true); /* fake up an address header for the from person */ - expand("\201n", buf, sizeof buf, e); + expand("\201n", buf, sizeof(buf), e); if (parseaddr(buf, &ee->e_from, RF_COPYALL|RF_SENDERADDR, '\0', NULL, e, false) == NULL) { @@ -778,7 +778,7 @@ errbody(mci, e, separator) if (e->e_msgboundary != NULL) { - (void) sm_strlcpyn(buf, sizeof buf, 2, "--", e->e_msgboundary); + (void) sm_strlcpyn(buf, sizeof(buf), 2, "--", e->e_msgboundary); if (!putline("This is a MIME-encapsulated message", mci) || !putline("", mci) || !putline(buf, mci) || @@ -816,19 +816,19 @@ errbody(mci, e, separator) !putline("", mci)) goto writeerr; } - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "The original message was received at %s", arpadate(ctime(&e->e_parent->e_ctime))); if (!putline(buf, mci)) goto writeerr; - expand("from \201_", buf, sizeof buf, e->e_parent); + expand("from \201_", buf, sizeof(buf), e->e_parent); if (!putline(buf, mci)) goto writeerr; /* include id in postmaster copies */ if (pm_notify && e->e_parent->e_id != NULL) { - (void) sm_strlcpyn(buf, sizeof buf, 2, "with id ", + (void) sm_strlcpyn(buf, sizeof(buf), 2, "with id ", e->e_parent->e_id); if (!putline(buf, mci)) goto writeerr; @@ -856,11 +856,19 @@ errbody(mci, e, separator) if (xfile != NULL) { while (sm_io_fgets(xfile, SM_TIME_DEFAULT, buf, - sizeof buf) != NULL) + sizeof(buf)) != NULL) { - translate_dollars(buf); - expand(buf, buf, sizeof buf, e); - if (!putline(buf, mci)) + int lbs; + bool putok; + char *lbp; + + lbs = sizeof(buf); + lbp = translate_dollars(buf, buf, &lbs); + expand(lbp, lbp, lbs, e); + putok = putline(lbp, mci); + if (lbp != buf) + sm_free(lbp); + if (!putok) goto writeerr; } (void) sm_io_close(xfile, SM_TIME_DEFAULT); @@ -870,7 +878,7 @@ errbody(mci, e, separator) } else { - expand(ErrMsgFile, buf, sizeof buf, e); + expand(ErrMsgFile, buf, sizeof(buf), e); if (!putline(buf, mci) || !putline("", mci)) goto writeerr; } @@ -897,12 +905,12 @@ errbody(mci, e, separator) } (void) sm_strlcpy(buf, shortenstring(q->q_paddr, MAXSHORTSTR), - sizeof buf); + sizeof(buf)); if (!putline(buf, mci)) goto writeerr; if (q->q_rstatus != NULL) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), " (reason: %s)", shortenstring(exitstat(q->q_rstatus), MAXSHORTSTR)); @@ -911,7 +919,7 @@ errbody(mci, e, separator) } if (q->q_alias != NULL) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), " (expanded from: %s)", shortenstring(q->q_alias->q_paddr, MAXSHORTSTR)); @@ -941,12 +949,12 @@ errbody(mci, e, separator) } (void) sm_strlcpy(buf, shortenstring(q->q_paddr, MAXSHORTSTR), - sizeof buf); + sizeof(buf)); if (!putline(buf, mci)) goto writeerr; if (q->q_alias != NULL) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), " (expanded from: %s)", shortenstring(q->q_alias->q_paddr, MAXSHORTSTR)); @@ -994,13 +1002,13 @@ errbody(mci, e, separator) printheader = false; } - (void) sm_snprintf(buf, sizeof buf, "%s (%s)", + (void) sm_snprintf(buf, sizeof(buf), "%s (%s)", shortenstring(q->q_paddr, MAXSHORTSTR), p); if (!putline(buf, mci)) goto writeerr; if (q->q_alias != NULL) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), " (expanded from: %s)", shortenstring(q->q_alias->q_paddr, MAXSHORTSTR)); @@ -1029,7 +1037,7 @@ errbody(mci, e, separator) if (e->e_xfp != NULL) (void) sm_io_flush(e->e_xfp, SM_TIME_DEFAULT); while (sm_io_fgets(e->e_parent->e_xfp, SM_TIME_DEFAULT, buf, - sizeof buf) != NULL) + sizeof(buf)) != NULL) { if (printheader && !putline(" ----- Transcript of session follows -----\n", mci)) @@ -1048,7 +1056,7 @@ errbody(mci, e, separator) if (e->e_msgboundary != NULL) { - (void) sm_strlcpyn(buf, sizeof buf, 2, "--", e->e_msgboundary); + (void) sm_strlcpyn(buf, sizeof(buf), 2, "--", e->e_msgboundary); if (!putline("", mci) || !putline(buf, mci) || !putline("Content-Type: message/delivery-status", mci) || @@ -1062,7 +1070,7 @@ errbody(mci, e, separator) /* original envelope id from MAIL FROM: line */ if (e->e_parent->e_envid != NULL) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Original-Envelope-Id: %.800s", xuntextify(e->e_parent->e_envid)); if (!putline(buf, mci)) @@ -1070,7 +1078,7 @@ errbody(mci, e, separator) } /* Reporting-MTA: is us (required) */ - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Reporting-MTA: dns; %.800s", MyHostName); if (!putline(buf, mci)) goto writeerr; @@ -1084,7 +1092,7 @@ errbody(mci, e, separator) if (e->e_parent->e_from.q_mailer == NULL || (p = e->e_parent->e_from.q_mailer->m_mtatype) == NULL) p = "dns"; - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Received-From-MTA: %s; %.800s", p, RealHostName); if (!putline(buf, mci)) @@ -1092,7 +1100,7 @@ errbody(mci, e, separator) } /* Arrival-Date: -- when it arrived here */ - (void) sm_strlcpyn(buf, sizeof buf, 2, "Arrival-Date: ", + (void) sm_strlcpyn(buf, sizeof(buf), 2, "Arrival-Date: ", arpadate(ctime(&e->e_parent->e_ctime))); if (!putline(buf, mci)) goto writeerr; @@ -1103,7 +1111,7 @@ errbody(mci, e, separator) time_t dbyd; dbyd = e->e_parent->e_ctime + e->e_parent->e_deliver_by; - (void) sm_strlcpyn(buf, sizeof buf, 2, + (void) sm_strlcpyn(buf, sizeof(buf), 2, "Deliver-By-Date: ", arpadate(ctime(&dbyd))); if (!putline(buf, mci)) @@ -1156,7 +1164,7 @@ errbody(mci, e, separator) /* Original-Recipient: -- passed from on high */ if (q->q_orcpt != NULL) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Original-Recipient: %.800s", q->q_orcpt); if (!putline(buf, mci)) @@ -1177,7 +1185,7 @@ errbody(mci, e, separator) strchr(q->q_user, '@') == NULL) { (void) sm_snprintf(actual, - sizeof actual, + sizeof(actual), "%s; %.700s@%.100s", p, q->q_user, MyHostName); @@ -1185,7 +1193,7 @@ errbody(mci, e, separator) else { (void) sm_snprintf(actual, - sizeof actual, + sizeof(actual), "%s; %.800s", p, q->q_user); } @@ -1206,7 +1214,7 @@ errbody(mci, e, separator) if (q->q_finalrcpt != NULL) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Final-Recipient: %s", q->q_finalrcpt); if (!putline(buf, mci)) @@ -1216,12 +1224,10 @@ errbody(mci, e, separator) /* X-Actual-Recipient: -- the real problem address */ if (actual[0] != '\0' && q->q_finalrcpt != NULL && -#if _FFR_PRIV_NOACTUALRECIPIENT !bitset(PRIV_NOACTUALRECIPIENT, PrivacyFlags) && -#endif /* _FFR_PRIV_NOACTUALRECIPIENT */ strcmp(actual, q->q_finalrcpt) != 0) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "X-Actual-Recipient: %s", actual); if (!putline(buf, mci)) @@ -1229,7 +1235,7 @@ errbody(mci, e, separator) } /* Action: -- what happened? */ - (void) sm_strlcpyn(buf, sizeof buf, 2, "Action: ", + (void) sm_strlcpyn(buf, sizeof(buf), 2, "Action: ", action); if (!putline(buf, mci)) goto writeerr; @@ -1243,7 +1249,7 @@ errbody(mci, e, separator) p = "4.0.0"; else p = "2.0.0"; - (void) sm_strlcpyn(buf, sizeof buf, 2, "Status: ", p); + (void) sm_strlcpyn(buf, sizeof(buf), 2, "Status: ", p); if (!putline(buf, mci)) goto writeerr; @@ -1253,7 +1259,7 @@ errbody(mci, e, separator) if (q->q_mailer == NULL || (p = q->q_mailer->m_mtatype) == NULL) p = "dns"; - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Remote-MTA: %s; %.800s", p, q->q_statmta); p = &buf[strlen(buf) - 1]; @@ -1269,7 +1275,7 @@ errbody(mci, e, separator) if (q->q_mailer == NULL || (p = q->q_mailer->m_diagtype) == NULL) p = "smtp"; - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Diagnostic-Code: %s; %.800s", p, q->q_rstatus); if (!putline(buf, mci)) @@ -1279,7 +1285,7 @@ errbody(mci, e, separator) /* Last-Attempt-Date: -- fine granularity */ if (q->q_statdate == (time_t) 0L) q->q_statdate = curtime(); - (void) sm_strlcpyn(buf, sizeof buf, 2, + (void) sm_strlcpyn(buf, sizeof(buf), 2, "Last-Attempt-Date: ", arpadate(ctime(&q->q_statdate))); if (!putline(buf, mci)) @@ -1292,7 +1298,7 @@ errbody(mci, e, separator) xdate = e->e_parent->e_ctime + TimeOuts.to_q_return[e->e_parent->e_timeoutclass]; - (void) sm_strlcpyn(buf, sizeof buf, 2, + (void) sm_strlcpyn(buf, sizeof(buf), 2, "Will-Retry-Until: ", arpadate(ctime(&xdate))); if (!putline(buf, mci)) @@ -1326,12 +1332,12 @@ errbody(mci, e, separator) } else { - (void) sm_strlcpyn(buf, sizeof buf, 2, "--", + (void) sm_strlcpyn(buf, sizeof(buf), 2, "--", e->e_msgboundary); if (!putline(buf, mci)) goto writeerr; - (void) sm_strlcpyn(buf, sizeof buf, 2, "Content-Type: ", + (void) sm_strlcpyn(buf, sizeof(buf), 2, "Content-Type: ", sendbody ? "message/rfc822" : "text/rfc822-headers"); if (!putline(buf, mci)) @@ -1346,7 +1352,7 @@ errbody(mci, e, separator) p = "8bit"; if (p != NULL) { - (void) sm_snprintf(buf, sizeof buf, + (void) sm_snprintf(buf, sizeof(buf), "Content-Transfer-Encoding: %s", p); if (!putline(buf, mci)) @@ -1383,7 +1389,7 @@ errbody(mci, e, separator) if (e->e_msgboundary != NULL) { - (void) sm_strlcpyn(buf, sizeof buf, 3, "--", e->e_msgboundary, + (void) sm_strlcpyn(buf, sizeof(buf), 3, "--", e->e_msgboundary, "--"); if (!putline("", mci) || !putline(buf, mci)) goto writeerr; @@ -1727,9 +1733,9 @@ pruneroute(addr) /* slice off the angle brackets */ i = strlen(at + 1); - if (i >= sizeof hostbuf) + if (i >= sizeof(hostbuf)) return false; - (void) sm_strlcpy(hostbuf, at + 1, sizeof hostbuf); + (void) sm_strlcpy(hostbuf, at + 1, sizeof(hostbuf)); hostbuf[i - 1] = '\0'; while (start != NULL) @@ -1745,8 +1751,8 @@ pruneroute(addr) *start = '\0'; comma = strrchr(addr, ','); if (comma != NULL && comma[1] == '@' && - strlen(comma + 2) < sizeof hostbuf) - (void) sm_strlcpy(hostbuf, comma + 2, sizeof hostbuf); + strlen(comma + 2) < sizeof(hostbuf)) + (void) sm_strlcpy(hostbuf, comma + 2, sizeof(hostbuf)); else comma = NULL; *start = c;