diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2001-02-28 02:43:57 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2001-02-28 02:43:57 +0000 |
commit | dcf623472bc9963a885e9117fe0db7567e4bf4f0 (patch) | |
tree | 03a753524b111df1ba3f86da7fcb61c5a1e52c1a /gnu/usr.sbin | |
parent | 3ac8563baefed0d06c236cb4e2f9cede71e6c959 (diff) |
Update to sendmail 8.11.3. This is a maintenance release which
contains bug fixes for problems found after 8.11.2 was released.
Systems which use buffered file I/O (like OpenBSD) were not properly
fsync()'ing the data (df) file. Although there is little chance
of data loss, this is an important fix.
Diffstat (limited to 'gnu/usr.sbin')
47 files changed, 1064 insertions, 505 deletions
diff --git a/gnu/usr.sbin/sendmail/LICENSE b/gnu/usr.sbin/sendmail/LICENSE index ac41b4b7d72..4a89057fae6 100644 --- a/gnu/usr.sbin/sendmail/LICENSE +++ b/gnu/usr.sbin/sendmail/LICENSE @@ -33,7 +33,7 @@ each of the following conditions is met: forth as paragraph 6 below, in the documentation and/or other materials provided with the distribution. For the purposes of binary distribution the "Copyright Notice" refers to the following language: - "Copyright (c) 1998-2000 Sendmail, Inc. All rights reserved." + "Copyright (c) 1998-2001 Sendmail, Inc. All rights reserved." 4. Neither the name of Sendmail, Inc. nor the University of California nor the names of their contributors may be used to endorse or promote @@ -76,4 +76,4 @@ each of the following conditions is met: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -$Revision: 1.3 $, Last updated $Date: 2001/01/15 21:08:50 $ +$Revision: 1.4 $, Last updated $Date: 2001/02/28 02:43:48 $ diff --git a/gnu/usr.sbin/sendmail/RELEASE_NOTES b/gnu/usr.sbin/sendmail/RELEASE_NOTES index 3308551c5e2..7a87c8d6fcb 100644 --- a/gnu/usr.sbin/sendmail/RELEASE_NOTES +++ b/gnu/usr.sbin/sendmail/RELEASE_NOTES @@ -1,11 +1,86 @@ SENDMAIL RELEASE NOTES - $Sendmail: RELEASE_NOTES,v 8.561.2.5.2.181 2000/12/28 23:56:46 gshapiro Exp $ + $Sendmail: RELEASE_NOTES,v 8.561.2.5.2.208 2001/02/26 21:24:54 gshapiro Exp $ This listing shows the version of the sendmail binary, the version of the sendmail configuration files, the date of release, and a summary of the changes in that release. +8.11.3/8.11.3 2001/02/27 + Prevent a segmentation fault when a bogus value was used in the + LDAPDefaultSpec option's -r, -s, or -M flags and if a bogus + option was used. Problem noted by Allan E Johannesen of + Worcester Polytechnic Institute. + Prevent "token too long" message by shortening {currHeader} which + could be too long if the last copied character was a quote. + Problem detected by Jan Krueger of digitalanswers + communications consulting gmbh. + Additional IPv6 check for unspecified addresses. Patch from + Jun-ichiro itojun Hagino of the KAME Project. + Do not ignore the ClientPortOptions setting if DaemonPortOptions + Modifier=b (bind to same interface) is set and the + connection came in from the command line. + Do not bind to the loopback address if DaemonPortOptions + Modifier=b (bind to same interface) is set. Patch from + John Beck of Sun Microsystems. + Properly deal with open failures on non-optional maps used in + check_* rulesets by returning a temporary failure. + Buffered file I/O files were not being properly fsync'ed to disk + when they were committed. + Properly encode '=' for the AUTH= parameter of the MAIL command. + Problem noted by Hadmut Danisch. + Under certain circumstances the macro {server_name} could be set + to the wrong hostname (of a previous connection), which may + cause some rulesets to return wrong results. This would + usually cause mail to be queued up and delivered later on. + Ignore F=z (LMTP) mailer flag if $u is given in the mailer A= + equate. Problem noted by Motonori Nakamura of Kyoto + University. + Work around broken accept() implementations which only partially + fill in the peer address if the socket is closed before + accept() completes. + Return an SMTP "421" temporary failure if the data file can't be + opened where the "354" reply would normally be given. + Prevent a CPU loop in trying to expand a macro which doesn't exist + in a queue run. Problem noted by Gordon Lack of Glaxo + Wellcome. + If delivering via a program and that program exits with EX_TEMPFAIL, + note that fact for the mailq display instead of just showing + "Deferred". Problem noted by Motonori Nakamura of Kyoto + University. + If doing canonification via /etc/hosts, try both the fully + qualified hostname as well as the first portion of the + hostname. Problem noted by David Bremner of the + University of New Brunswick. + Portability: + Fix a compilation problem for mail.local and rmail if SFIO + is in use. Problem noted by Auteria Wally + Winzer Jr. of Champion Nutrition. + IPv6 changes for platforms using KAME. Patch from + Jun-ichiro itojun Hagino of the KAME Project. + OpenBSD 2.7 and higher has srandomdev(3). OpenBSD 2.8 and + higher has BSDI-style login classes. Patch from + Todd C. Miller of Courtesan Consulting. + Unixware 7.1.1 doesn't allow h_errno to be set directly if + sendmail is being compiled with -kthread. Problem + noted by Orion Poplawski of CQG, Inc. + CONTRIB: buildvirtuser: Substitute current domain for $DOMAIN and + current left hand side for $LHS in virtuser files. + DEVTOOLS: Do not pass make targets to recursive Build invocations. + Problem noted by Jeff Bronson of J.D. Bronson, Inc. + MAIL.LOCAL: In LMTP mode, do not return errors regarding problems + storing the temporary message file until after the remote + side has sent the final DATA termination dot. Problem + noted by Allan E Johannesen of Worcester Polytechnic + Institute. + MAIL.LOCAL: If LMTP mode is set, give a temporary error if users + are also specified on the command line. Patch from + Motonori Nakamura of Kyoto University. + PRALIASES: Skip over AliasFile specifications which aren't based on + database files (i.e., only show dbm, hash, and btree). + Renamed Files: + devtools/OS/OSF1.V5.0 => devtools/OS/OSF1.V5.x + 8.11.2/8.11.2 2000/12/29 Prevent a segmentation fault when trying to set a class in address test mode due to a negative array index. Audit @@ -89,7 +164,7 @@ summary of the changes in that release. is used. Problem noted by Phil Homewood of Asia Online, patch from Neil Rickert of Northern Illinois University. CONFIG: Change the default DNS based blacklist server for - FEATURE(`dnsbl') to blackholes.mail-abuse.org. + FEATURE(`dnsbl') to blackholes.mail-abuse.org. CONFIG: Deal correctly with the 'C' flag in {daemon_flags}, i.e., implicitly assume canonical host names. CONFIG: Deal with "::" in IPv6 addresses for access_db. Based on @@ -107,7 +182,7 @@ summary of the changes in that release. Roth of the University of Illinois at Urbana-Champaign. DEVTOOLS: Change the internal devtools OS, REL, and ARCH m4 variables into bldOS, bldREL, and bldARCH to prevent - namespace collisions. Problem noted by Motonori Nakamura + namespace collisions. Problem noted by Motonori Nakamura of Kyoto University. RMAIL: Undo the 8.11.1 change to use -G when calling sendmail. It causes some changes in behavior and may break rmail for diff --git a/gnu/usr.sbin/sendmail/cf/README b/gnu/usr.sbin/sendmail/cf/README index 0208e727be5..9b80af4a94d 100644 --- a/gnu/usr.sbin/sendmail/cf/README +++ b/gnu/usr.sbin/sendmail/cf/README @@ -54,7 +54,7 @@ Let's examine a typical .mc file: divert(-1) # - # Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + # Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -254,12 +254,13 @@ HELP_FILE [/etc/mail/helpfile] The name of the file QUEUE_DIR [/var/spool/mqueue] The directory containing queue files. To use multiple queues, supply a value ending with an asterisk. For - example, /var/spool/mqueue/q* will use all of the + example, /var/spool/mqueue/qd* will use all of the directories or symbolic links to directories - beginning with 'q' in /var/spool/mqueue as queue + beginning with 'qd' in /var/spool/mqueue as queue directories. The names 'qf', 'df', and 'xf' are - used as specific subdirectories for the corresponding - queue file types. + reserved as specific subdirectories for the + corresponding queue file types as explained in + doc/op/op.me. STATUS_FILE [/etc/mail/statistics] The file containing status information. LOCAL_MAILER_PATH [/bin/mail] The program used to deliver local mail. @@ -665,7 +666,7 @@ stickyhost This feature is sometimes used with LOCAL_RELAY, although it can be used for a different effect with MAIL_HUB. - When used with without MAIL_HUB, email sent to + When used without MAIL_HUB, email sent to "user@local.host" are marked as "sticky" -- that is, the local addresses aren't matched against UDB, don't go through ruleset 5, and are not forwarded to @@ -1860,8 +1861,8 @@ for your purposes. There is now the option to tag entries in the access map according to their type. Three tags are available: Connect: connection information (${client_addr}, ${client_name}) - From: sender - To: recipient + From: envelope sender + To: envelope recipient If the required item is looked up in a map, it will be tried first with the corresponding tag in front, then (as fallback to enable @@ -1913,7 +1914,7 @@ avoid this problem you have to use tagged entries: Connect:my.domain RELAY if you need those entries at all (class {R} may take care of them). - + FEATURE(`delay_checks') can take an optional argument: FEATURE(`delay_checks', `friend') @@ -1966,6 +1967,11 @@ defined for them can be given by: H*: $>CheckHdr +Notice: All rules act on tokens as explained in doc/op/op.{me,ps,txt}. +That may cause problems with simple header checks due to the +tokenization. It might be simpler to use a regex map and apply it +to $&{currHeader}. + After all of the headers are read, the check_eoh ruleset will be called for any final header-related checks. The ruleset is called with the number of headers and the size of all of the headers in bytes separated by $|. One @@ -2113,6 +2119,20 @@ should only be accepted if they have been authenticated. TLS_Srv:secure.example.com ENCR:112 TLS_Clt:laptop.example.com PERM+VERIFY:112 +Notice: requiring that e-mail is sent to a server only encrypted, +e.g., via + +TLS_Srv:secure.domain ENCR:112 + +doesn't necessarily mean that e-mail sent to that domain is encrypted. +If the domain has multiple MX servers, e.g., + +secure.domain. IN MX 10 mail.secure.domain. +secure.domain. IN MX 50 mail.other.domain. + +then mail to user@secure.domain may go unencrypted to mail.other.domain. + + Received: Header The Received: header reveals whether STARTTLS has been used. It contains an @@ -2979,7 +2999,7 @@ confAUTH_MECHANISMS AuthMechanisms [GSSAPI KERBEROS_V4 DIGEST-MD5 intersection of this list and the list of available mechanisms as determined by the CYRUS SASL library. -confDEF_AUTH_INFO DefaultAuthInfo [undefined] Filename that contains +confDEF_AUTH_INFO DefaultAuthInfo [undefined] Name of file that contains authentication information for outgoing connections. This file must contain the user id, the @@ -3257,4 +3277,4 @@ M4 DIVERSIONS 8 DNS based blacklists 9 special local rulesets (1 and 2) -$Revision: 1.4 $, Last updated $Date: 2001/01/15 21:08:50 $ +$Revision: 1.5 $, Last updated $Date: 2001/02/28 02:43:49 $ diff --git a/gnu/usr.sbin/sendmail/cf/cf/knecht.mc b/gnu/usr.sbin/sendmail/cf/cf/knecht.mc index c3e686c6a24..394a53bb7dc 100644 --- a/gnu/usr.sbin/sendmail/cf/cf/knecht.mc +++ b/gnu/usr.sbin/sendmail/cf/cf/knecht.mc @@ -1,6 +1,6 @@ divert(-1) # -# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998, 1999, 2001 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -17,8 +17,8 @@ divert(-1) # divert(0)dnl -VERSIONID(`$Sendmail: knecht.mc,v 8.37 1999/11/19 05:18:12 gshapiro Exp $') -OSTYPE(bsdi)dnl +VERSIONID(`$Sendmail: knecht.mc,v 8.37.16.3 2001/02/22 22:38:39 ca Exp $') +OSTYPE(bsd4.4)dnl DOMAIN(generic)dnl define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward+$h:$z/.forward')dnl define(`confDEF_USER_ID', `mailnull')dnl @@ -28,10 +28,16 @@ define(`confCOPY_ERRORS_TO', `Postmaster')dnl define(`confTO_QUEUEWARN', `8h')dnl define(`confTRUSTED_USERS', `www')dnl define(`confPRIVACY_FLAGS', ``authwarnings,noexpn,novrfy'')dnl +define(`CERT_DIR', `MAIL_SETTINGS_DIR`'certs')dnl +define(`confCACERT_PATH', `CERT_DIR')dnl +define(`confCACERT', `CERT_DIR/CAcert.pem')dnl +define(`confSERVER_CERT', `CERT_DIR/MYcert.pem')dnl +define(`confSERVER_KEY', `CERT_DIR/MYkey.pem')dnl +define(`confCLIENT_CERT', `CERT_DIR/MYcert.pem')dnl +define(`confCLIENT_KEY', `CERT_DIR/MYkey.pem')dnl FEATURE(virtusertable)dnl FEATURE(access_db)dnl FEATURE(local_lmtp)dnl -MODIFY_MAILER_FLAGS(`LOCAL', `+P')dnl MAILER(local)dnl MAILER(smtp)dnl @@ -61,7 +67,7 @@ HMessage-Id: $>CheckMessageId SCheckMessageId R< $+ @ $+ > $@ OK -R$* $#error $: "553 Header error" +R$* $#error $: "554 Header error" LOCAL_RULESETS SLocal_check_mail diff --git a/gnu/usr.sbin/sendmail/cf/m4/cfhead.m4 b/gnu/usr.sbin/sendmail/cf/m4/cfhead.m4 index ea125f15e13..38d08683048 100644 --- a/gnu/usr.sbin/sendmail/cf/m4/cfhead.m4 +++ b/gnu/usr.sbin/sendmail/cf/m4/cfhead.m4 @@ -1,5 +1,5 @@ # -# Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -154,28 +154,28 @@ define(`SITE', `ifelse(CONCAT($'2`, $3), SU, CONCAT(CY, $'1`), CONCAT(C, $3, $'1`))') sinclude(_CF_DIR_`'siteconfig/$1.m4)') -define(`EXPOSED_USER', `PUSHDIVERT(5)CE$1 +define(`EXPOSED_USER', `PUSHDIVERT(5)C{E}$1 POPDIVERT`'dnl`'') -ifdef(`_FFR_EXPOSED_USER_FILE', `define(`EXPOSED_USER_FILE', `PUSHDIVERT(5)FE$1 +ifdef(`_FFR_EXPOSED_USER_FILE', `define(`EXPOSED_USER_FILE', `PUSHDIVERT(5)F{E}$1 POPDIVERT`'dnl`'')', `dnl') -define(`LOCAL_USER', `PUSHDIVERT(5)CL$1 +define(`LOCAL_USER', `PUSHDIVERT(5)C{L}$1 POPDIVERT`'dnl`'') define(`MASQUERADE_AS', `define(`MASQUERADE_NAME', $1)') -define(`MASQUERADE_DOMAIN', `PUSHDIVERT(5)CM$1 +define(`MASQUERADE_DOMAIN', `PUSHDIVERT(5)C{M}$1 POPDIVERT`'dnl`'') -define(`MASQUERADE_EXCEPTION', `PUSHDIVERT(5)CN$1 +define(`MASQUERADE_EXCEPTION', `PUSHDIVERT(5)C{N}$1 POPDIVERT`'dnl`'') -define(`MASQUERADE_DOMAIN_FILE', `PUSHDIVERT(5)FM$1 +define(`MASQUERADE_DOMAIN_FILE', `PUSHDIVERT(5)F{M}$1 POPDIVERT`'dnl`'') -define(`LOCAL_DOMAIN', `PUSHDIVERT(5)Cw$1 +define(`LOCAL_DOMAIN', `PUSHDIVERT(5)C{w}$1 POPDIVERT`'dnl`'') define(`CANONIFY_DOMAIN', `PUSHDIVERT(5)C{Canonify}$1 POPDIVERT`'dnl`'') define(`CANONIFY_DOMAIN_FILE', `PUSHDIVERT(5)F{Canonify}$1 POPDIVERT`'dnl`'') -define(`GENERICS_DOMAIN', `PUSHDIVERT(5)CG$1 +define(`GENERICS_DOMAIN', `PUSHDIVERT(5)C{G}$1 POPDIVERT`'dnl`'') -define(`GENERICS_DOMAIN_FILE', `PUSHDIVERT(5)FG$1 +define(`GENERICS_DOMAIN_FILE', `PUSHDIVERT(5)F{G}$1 POPDIVERT`'dnl`'') define(`LDAPROUTE_DOMAIN', `PUSHDIVERT(5)C{LDAPRoute}$1 POPDIVERT`'dnl`'') @@ -187,9 +187,9 @@ POPDIVERT`'dnl`'') define(`VIRTUSER_DOMAIN_FILE', `PUSHDIVERT(5)F{VirtHost}$1 define(`_VIRTHOSTS_') POPDIVERT`'dnl`'') -define(`RELAY_DOMAIN', `PUSHDIVERT(5)CR$1 +define(`RELAY_DOMAIN', `PUSHDIVERT(5)C{R}$1 POPDIVERT`'dnl`'') -define(`RELAY_DOMAIN_FILE', `PUSHDIVERT(5)FR$1 +define(`RELAY_DOMAIN_FILE', `PUSHDIVERT(5)F{R}$1 POPDIVERT`'dnl`'') define(`TRUST_AUTH_MECH', `PUSHDIVERT(5)C{TrustAuthMech}$1 POPDIVERT`'dnl`'') @@ -252,4 +252,4 @@ define(`confMILTER_MACROS_ENVRCPT', ``{rcpt_mailer}, {rcpt_host}, {rcpt_addr}'') divert(0)dnl -VERSIONID(`$Sendmail: cfhead.m4,v 8.76.4.13 2000/08/24 17:09:50 gshapiro Exp $') +VERSIONID(`$Sendmail: cfhead.m4,v 8.76.4.15 2001/02/14 04:07:20 gshapiro Exp $') diff --git a/gnu/usr.sbin/sendmail/cf/m4/version.m4 b/gnu/usr.sbin/sendmail/cf/m4/version.m4 index 602e9f3dd7d..4c9e5a0dadd 100644 --- a/gnu/usr.sbin/sendmail/cf/m4/version.m4 +++ b/gnu/usr.sbin/sendmail/cf/m4/version.m4 @@ -1,6 +1,6 @@ divert(-1) # -# Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -11,8 +11,8 @@ divert(-1) # the sendmail distribution. # # -VERSIONID(`$Sendmail: version.m4,v 8.39.4.21 2000/12/29 18:22:15 gshapiro Exp $') +VERSIONID(`$Sendmail: version.m4,v 8.39.4.26 2001/02/27 19:22:29 gshapiro Exp $') # divert(0) # Configuration version number -DZ8.11.2`'ifdef(`confCF_VERSION', `/confCF_VERSION') +DZ8.11.3`'ifdef(`confCF_VERSION', `/confCF_VERSION') diff --git a/gnu/usr.sbin/sendmail/contrib/buildvirtuser b/gnu/usr.sbin/sendmail/contrib/buildvirtuser index 44012f0639b..5b3c872e789 100644 --- a/gnu/usr.sbin/sendmail/contrib/buildvirtuser +++ b/gnu/usr.sbin/sendmail/contrib/buildvirtuser @@ -1,6 +1,6 @@ #!/usr/bin/perl -w -# Copyright (c) 1999-2000 Gregory Neil Shapiro. All Rights Reserved. +# Copyright (c) 1999-2001 Gregory Neil Shapiro. All Rights Reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -27,7 +27,7 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. -# $Sendmail: buildvirtuser,v 1.1.2.1 2000/10/26 22:51:03 gshapiro Exp $ +# $Sendmail: buildvirtuser,v 1.1.2.3 2001/02/12 02:57:13 gshapiro Exp $ =head1 NAME @@ -45,7 +45,10 @@ directory should contain one file per virtual domain with the filename matching the virtual domain name and the contents containing a list of usernames on the left and the actual address for that username on the right. An empty left column translates to the default for that domain. -Blank lines and lines beginning with '#' are ignored. +Blank lines and lines beginning with '#' are ignored. Occurrences of +$DOMAIN in the file are replaced by the current domain being processed. +Occurrences of $LHS in the right hand side are replaced by the address on +the left hand side. =head1 CONFIGURATION @@ -66,21 +69,21 @@ Here are some example files from the /etc/mail/virtusers/ directory: =head2 /etc/mail/virtusers/bsdunix.org: # Services - MAILER-DAEMON gshapiro+MAILER-DAEMON.bsdunix.org@gshapiro.net - postmaster gshapiro+postmaster.bsdunix.org@gshapiro.net - webmaster gshapiro+webmaster.bsdunix.org@gshapiro.net + MAILER-DAEMON gshapiro+bounce.$DOMAIN@gshapiro.net + postmaster gshapiro+$LHS.$DOMAIN@gshapiro.net + webmaster gshapiro+$LHS.$DOMAIN@gshapiro.net # Defaults error:nouser No such user # Users - gshapiro gshapiro+bsdunix.org@gshapiro.net + gshapiro gshapiro+$DOMAIN@gshapiro.net bob robert@smtp.org =head2 /etc/mail/virtusers/smtp.org: # Defaults - gshapiro+smtp.org@gshapiro.net + gshapiro+$DOMAIN@gshapiro.net # Users john john@wookie.org @@ -92,6 +95,8 @@ Gregory Neil Shapiro E<lt>F<gshapiro@gshapiro.net>E<gt> =cut +use strict; + my $makemap = "/usr/sbin/makemap"; my $dbtype = "hash"; my $maildir = "/etc/mail"; @@ -102,6 +107,7 @@ my $newvirt = "$maildir/virtusertable.new.db"; my $virt = "$maildir/virtusertable.db"; my %virt = (); my $newest = 0; +my ($lhs, $domain, $key, $value); opendir(VIRTS, $virts) || die "Could not open directory $virts: $!\n"; my @virts = grep { -f "$virts/$_" } readdir(VIRTS); @@ -126,10 +132,12 @@ LINE: while (<DOMAIN>) { if (defined($1)) { + $lhs = "$1"; $key = "$1\@$domain"; } else { + $lhs = ""; $key = "\@$domain"; } $value = $2; @@ -138,6 +146,11 @@ LINE: while (<DOMAIN>) { die "Bogus line $line in $virts/$domain\n"; } + + # Variable subsitution + $key =~ s/\$DOMAIN/$domain/g; + $value =~ s/\$DOMAIN/$domain/g; + $value =~ s/\$LHS/$lhs/g; $virt{$key} = $value; } close(DOMAIN) || die "Could not close $virts/$domain: $!\n"; diff --git a/gnu/usr.sbin/sendmail/doc/op/op.me b/gnu/usr.sbin/sendmail/doc/op/op.me index 3c5efb96e72..f9599c30fbf 100644 --- a/gnu/usr.sbin/sendmail/doc/op/op.me +++ b/gnu/usr.sbin/sendmail/doc/op/op.me @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. +.\" Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. .\" All rights reserved. .\" Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. .\" Copyright (c) 1983, 1993 @@ -9,7 +9,7 @@ .\" the sendmail distribution. .\" .\" -.\" $Sendmail: op.me,v 8.317.4.47 2000/12/17 00:54:56 gshapiro Exp $ +.\" $Sendmail: op.me,v 8.317.4.56 2001/02/15 23:38:16 ca Exp $ .\" .\" eqn op.me | pic | troff -me .eh 'SMM:08-%''Sendmail Installation and Operation Guide' @@ -53,7 +53,7 @@ eric@Sendmail.COM .de Ve Version \\$2 .. -.Ve $Revision: 1.4 $ +.Ve $Revision: 1.5 $ .rm Ve .sp For Sendmail Version 8.11 @@ -99,7 +99,7 @@ RFC1652 (SMTP 8BITMIME Extension), RFC1870 (SMTP SIZE Extension), RFC1891 (SMTP Delivery Status Notifications), RFC1892 (Multipart/Report), -RFC1893 (Mail System Status Codes), +RFC1893 (Enhanced Mail System Status Codes), RFC1894 (Delivery Status Notifications), RFC1985 (SMTP Service Extension for Remote Message Queue Starting), RFC2033 (Local Message Transmission Protocol), @@ -624,7 +624,7 @@ option is set. .pp This command is also a link to .i sendmail . -It flushes all information that is stored in the +It flushes expired (Timeout.hoststatus) information that is stored in the .b HostStatusDirectory tree. .sh 3 "/var/spool/mqueue" @@ -644,9 +644,9 @@ file. To use multiple queues, supply a value ending with an asterisk. For example, -.i /var/spool/mqueue/q* +.i /var/spool/mqueue/qd* will use all of the directories or symbolic links to directories -beginning with `q' in +beginning with `qd' in .i /var/spool/mqueue as queue directories. Do not change the queue directory structure @@ -1141,6 +1141,9 @@ Removing this directory and its subdirectories has an effect similar to the .i purgestat command and is completely safe. +However, +.i purgestat +only removes expired (Timeout.hoststatus) data. The information in these directories can be perused with the .i hoststat @@ -1158,7 +1161,7 @@ the .b Timeout.hoststatus option. .pp -The connection information stored on disk may be purged at any time +The connection information stored on disk may be expired at any time with the .i purgestat command or by invoking sendmail with the @@ -1174,7 +1177,8 @@ switch. The implementation of certain system services such as host and user name lookup is controlled by the service switch. -If the host operating system supports such a switch +If the host operating system supports such a switch, +and sendmail knows about it, .i sendmail will use the native version. Ultrix, Solaris, and DEC OSF/1 are examples of such systems\**. @@ -4262,7 +4266,9 @@ FAIL cert presented but could not be verified, NONE STARTTLS has not been performed. TEMP temporary error occurred. PROTOCOL some protocol error occurred. -SOFTWARE STARTTLS handshake failed. +SOFTWARE STARTTLS handshake failed, + which is a fatal error for this session, + the e-mail will be queued. .)b .pp There are three types of dates that can be used. @@ -4504,6 +4510,9 @@ The syntax is: .br .b F \c .i c\|file +.br +.b F \c +.i c\||program .)b The first form defines the class .i c @@ -4530,11 +4539,13 @@ CHmonet CHucbmonet .)b are equivalent. -The ``F'' form -reads the elements of the class +The ``F'' forms +read the elements of the class .i c from the named -.i file . +.i file +or +.i program . Each element should be listed on a separate line. To specify an optional file, use ``-o'' between the class name and the file name, e.g., @@ -5382,7 +5393,7 @@ should be in the format ``\c .i class \c .b : -.i file '' +.i info '' where .i class \c .b : @@ -5397,6 +5408,10 @@ for back compatibility), (if .sm NEWDB is specified), +.q btree +(if +.sm NEWDB +is specified), .q dbm (if .sm NDBM @@ -5404,6 +5419,13 @@ is specified), .q stab (internal symbol table \*- not normally used unless you have no other database lookup), +.q sequence +(use a sequence of maps +previously declared), +.q ldap +(if +.sm LDAPMAP +is specified), or .q nis (if @@ -9390,7 +9412,7 @@ replace it with a blank sheet for double-sided output. .\".sz 10 .\"Eric Allman .\".sp -.\"Version $Revision: 1.4 $ +.\"Version $Revision: 1.5 $ .\".ce 0 .bp 3 .ce diff --git a/gnu/usr.sbin/sendmail/libmilter/README b/gnu/usr.sbin/sendmail/libmilter/README index 59d8beca9e1..f228dba21d2 100644 --- a/gnu/usr.sbin/sendmail/libmilter/README +++ b/gnu/usr.sbin/sendmail/libmilter/README @@ -44,6 +44,11 @@ threading support differs according to the compiler and linker used. Check the Makefile in your appropriate obj.*/libmilter build subdirectory if you are unsure of the local flag used. +Note that since filters use threads, it may be necessary to alter per +process limits in your filter. For example, you might look at using +setrlimit() to increase the number of open file descriptors if your filter +is going to be busy. + +----------------------------------------+ | SPECIFYING FILTERS IN SENDMAIL CONFIGS | @@ -416,4 +421,4 @@ main(argc, argv) /* eof */ -$Revision: 1.4 $, Last updated $Date: 2001/01/15 21:09:02 $ +$Revision: 1.5 $, Last updated $Date: 2001/02/28 02:43:51 $ diff --git a/gnu/usr.sbin/sendmail/libmilter/engine.c b/gnu/usr.sbin/sendmail/libmilter/engine.c index 6da335ef550..3ecbe6944f0 100644 --- a/gnu/usr.sbin/sendmail/libmilter/engine.c +++ b/gnu/usr.sbin/sendmail/libmilter/engine.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -9,7 +9,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: engine.c,v 8.67.4.15 2000/12/29 19:43:10 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: engine.c,v 8.67.4.17 2001/01/22 19:00:16 gshapiro Exp $"; #endif /* ! lint */ #if _FFR_MILTER @@ -122,7 +122,7 @@ static int dec_arg2 __P((char *, size_t, char **, char **)); #define NX_INIT (MASK(ST_OPTS)) #define NX_OPTS (MASK(ST_CONN)) #define NX_CONN (MASK(ST_HELO) | MASK(ST_MAIL)) -#define NX_HELO (MASK(ST_MAIL)) +#define NX_HELO (MASK(ST_HELO) | MASK(ST_MAIL)) #define NX_MAIL (MASK(ST_RCPT) | MASK(ST_ABRT)) #define NX_RCPT (MASK(ST_HDRS) | MASK(ST_EOHS) | MASK(ST_RCPT) | MASK(ST_ABRT)) #define NX_HDRS (MASK(ST_EOHS) | MASK(ST_HDRS) | MASK(ST_ABRT)) diff --git a/gnu/usr.sbin/sendmail/libmilter/listener.c b/gnu/usr.sbin/sendmail/libmilter/listener.c index 43a00e60a69..abf9d0879b4 100644 --- a/gnu/usr.sbin/sendmail/libmilter/listener.c +++ b/gnu/usr.sbin/sendmail/libmilter/listener.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -9,7 +9,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: listener.c,v 8.38.2.1.2.18 2000/12/29 19:44:28 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: listener.c,v 8.38.2.1.2.21 2001/02/14 02:20:40 gshapiro Exp $"; #endif /* ! lint */ #if _FFR_MILTER @@ -30,16 +30,19 @@ static char id[] = "@(#)$Sendmail: listener.c,v 8.38.2.1.2.18 2000/12/29 19:44:2 ** conn -- connection description ** backlog -- listen backlog ** socksize -- socksize of created socket +** family -- family of created socket +** name -- name for logging ** ** Returns: ** socket upon success, error code otherwise. */ static socket_t -mi_milteropen(conn, backlog, socksize, name) +mi_milteropen(conn, backlog, socksize, family, name) char *conn; int backlog; SOCKADDR_LEN_T *socksize; + int *family; char *name; { socket_t sock; @@ -393,7 +396,7 @@ mi_milteropen(conn, backlog, socksize, name) (void) close(sock); return INVALID_SOCKET; } - + *family = addr.sa.sa_family; return sock; } /* @@ -457,6 +460,46 @@ mi_closener() ** MI_FAILURE -- Network initialization failed. */ +# if BROKEN_PTHREAD_SLEEP + +/* +** Solaris 2.6, perhaps others, gets an internal threads library panic +** when sleep() is used: +** +** thread_create() failed, returned 11 (EINVAL) +** co_enable, thr_create() returned error = 24 +** libthread panic: co_enable failed (PID: 17793 LWP 1) +** stacktrace: +** ef526b10 +** ef52646c +** ef534cbc +** 156a4 +** 14644 +** 1413c +** 135e0 +** 0 +*/ + +# define MI_SLEEP(s) \ +{ \ + int rs = 0; \ + struct timeval st; \ + \ + st.tv_sec = (s); \ + st.tv_usec = 0; \ + if (st.tv_sec > 0) \ + rs = select(0, NULL, NULL, NULL, &st); \ + if (rs != 0) \ + { \ + smi_log(SMI_LOG_ERR, \ + "MI_SLEEP(): select() returned non-zero result %d, errno = %d", \ + rs, errno); \ + } \ +} +# else /* BROKEN_PTHREAD_SLEEP */ +# define MI_SLEEP(s) sleep((s)) +# endif /* BROKEN_PTHREAD_SLEEP */ + int mi_listener(conn, dbg, smfi, timeout, backlog) char *conn; @@ -466,11 +509,12 @@ mi_listener(conn, dbg, smfi, timeout, backlog) int backlog; { socket_t connfd = INVALID_SOCKET; + int family = AF_UNSPEC; int sockopt = 1; int r; int ret = MI_SUCCESS; - int cnt_m = 0; - int cnt_t = 0; + int mcnt = 0; + int tcnt = 0; sthread_t thread_id; _SOCK_ADDR cliaddr; SOCKADDR_LEN_T socksize; @@ -485,7 +529,8 @@ mi_listener(conn, dbg, smfi, timeout, backlog) smfi->xxfi_name, conn); (void) smutex_init(&L_Mutex); (void) smutex_lock(&L_Mutex); - listenfd = mi_milteropen(conn, backlog, &socksize, smfi->xxfi_name); + listenfd = mi_milteropen(conn, backlog, &socksize, &family, + smfi->xxfi_name); if (!ValidSocket(listenfd)) { smi_log(SMI_LOG_FATAL, @@ -545,10 +590,29 @@ mi_listener(conn, dbg, smfi, timeout, backlog) break; } + memset(&cliaddr, '\0', sizeof cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); (void) smutex_unlock(&L_Mutex); + /* + ** If remote side closes before + ** accept() finishes, sockaddr + ** might not be fully filled in. + */ + + if (ValidSocket(connfd) && + (clilen == 0 || +# ifdef BSD4_4_SOCKADDR + cliaddr.sa.sa_len == 0 || +# endif /* BSD4_4_SOCKADDR */ + cliaddr.sa.sa_family != family)) + { + (void) close(connfd); + connfd = INVALID_SOCKET; + errno = EINVAL; + } + if (!ValidSocket(connfd)) { smi_log(SMI_LOG_ERR, @@ -569,15 +633,16 @@ mi_listener(conn, dbg, smfi, timeout, backlog) (void) close(connfd); smi_log(SMI_LOG_ERR, "%s: malloc(ctx) failed", smfi->xxfi_name); - sleep(++cnt_m); - if (cnt_m >= MAX_FAILS_M) + mcnt++; + MI_SLEEP(mcnt); + if (mcnt >= MAX_FAILS_M) { ret = MI_FAILURE; break; } continue; } - cnt_m = 0; + mcnt = 0; memset(ctx, '\0', sizeof *ctx); ctx->ctx_sd = connfd; ctx->ctx_dbg = dbg; @@ -611,17 +676,18 @@ mi_listener(conn, dbg, smfi, timeout, backlog) smi_log(SMI_LOG_ERR, "%s: thread_create() failed: %d", smfi->xxfi_name, r); - sleep(++cnt_t); + tcnt++; + MI_SLEEP(tcnt); (void) close(connfd); free(ctx); - if (cnt_t >= MAX_FAILS_T) + if (tcnt >= MAX_FAILS_T) { ret = MI_FAILURE; break; } continue; } - cnt_t = 0; + tcnt = 0; } if (ret != MI_SUCCESS) mi_stop_milters(MILTER_ABRT); diff --git a/gnu/usr.sbin/sendmail/libmilter/sm_gethost.c b/gnu/usr.sbin/sendmail/libmilter/sm_gethost.c index b7de9775e08..ce2813395fd 100644 --- a/gnu/usr.sbin/sendmail/libmilter/sm_gethost.c +++ b/gnu/usr.sbin/sendmail/libmilter/sm_gethost.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -9,7 +9,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: sm_gethost.c,v 8.7.8.4 2000/12/19 04:26:33 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: sm_gethost.c,v 8.7.8.6 2001/02/14 04:07:23 gshapiro Exp $"; #endif /* ! lint */ #if _FFR_MILTER @@ -54,7 +54,7 @@ getipnodebyname(name, family, flags, err) resv6 = bitset(RES_USE_INET6, _res.options); _res.options |= RES_USE_INET6; } - h_errno = 0; + SM_SET_H_ERRNO(0); h = gethostbyname(name); *err = h_errno; if (family == AF_INET6 && !resv6) @@ -102,7 +102,7 @@ mi_gethostbyname(name, family) # if NETINET6 h = getipnodebyname(name, family, AI_V4MAPPED|AI_ALL, &err); - h_errno = err; + SM_SET_H_ERRNO(err); # else /* NETINET6 */ h = gethostbyname(name); # endif /* NETINET6 */ diff --git a/gnu/usr.sbin/sendmail/libsmdb/smdb2.c b/gnu/usr.sbin/sendmail/libsmdb/smdb2.c index 0f4d86b1c76..a1f9f20fdbb 100644 --- a/gnu/usr.sbin/sendmail/libsmdb/smdb2.c +++ b/gnu/usr.sbin/sendmail/libsmdb/smdb2.c @@ -1,5 +1,5 @@ /* -** Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers. +** Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. ** All rights reserved. ** ** By using this file, you agree to the terms and conditions set @@ -8,7 +8,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: smdb2.c,v 8.53.2.1.2.5 2000/10/26 00:39:56 geir Exp $"; +static char id[] = "@(#)$Sendmail: smdb2.c,v 8.53.2.1.2.7 2001/02/14 04:07:24 gshapiro Exp $"; #endif /* ! lint */ #include <fcntl.h> @@ -359,9 +359,12 @@ int smdb2_cursor_close(cursor) SMDB_CURSOR *cursor; { + int ret; DBC *dbc = (DBC *) cursor->smdbc_impl; - return db2_error_to_smdb(dbc->c_close(dbc)); + ret = db2_error_to_smdb(dbc->c_close(dbc)); + free(cursor); + return ret; } int diff --git a/gnu/usr.sbin/sendmail/mail.local/mail.local.c b/gnu/usr.sbin/sendmail/mail.local/mail.local.c index d9727510b69..ddef32d18fd 100644 --- a/gnu/usr.sbin/sendmail/mail.local/mail.local.c +++ b/gnu/usr.sbin/sendmail/mail.local/mail.local.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1990, 1993, 1994 * The Regents of the University of California. All rights reserved. @@ -12,14 +12,14 @@ #ifndef lint static char copyright[] = -"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\ +"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\ All rights reserved.\n\ Copyright (c) 1990, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* ! lint */ #ifndef lint -static char id[] = "@(#)$Sendmail: mail.local.c,v 8.143.4.39 2000/11/14 20:02:47 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: mail.local.c,v 8.143.4.57 2001/02/11 20:08:20 gshapiro Exp $"; #endif /* ! lint */ /* @@ -106,37 +106,25 @@ extern size_t strlcat __P((char *, const char *, size_t)); # if defined(_AIX) # define USE_LOCKF 1 # define USE_SETEUID 1 -# define USE_VSYSLOG 0 # endif /* defined(_AIX) */ # if defined(__hpux) # define USE_LOCKF 1 # define USE_SETRESUID 1 -# define USE_VSYSLOG 0 # endif /* defined(__hpux) */ # ifdef DGUX # define HASSNPRINTF 1 # define USE_LOCKF 1 -# define USE_VSYSLOG 0 # endif /* DGUX */ # if defined(_CRAY) # if !defined(MAXPATHLEN) # define MAXPATHLEN PATHSIZE # endif /* !defined(MAXPATHLEN) */ -# define USE_VSYSLOG 0 # define _PATH_MAILDIR "/usr/spool/mail" # endif /* defined(_CRAY) */ -# if defined(ultrix) -# define USE_VSYSLOG 0 -# endif /* defined(ultrix) */ - -# if defined(__osf__) -# define USE_VSYSLOG 0 -# endif /* defined(__osf__) */ - # if defined(NeXT) && !defined(__APPLE__) # include <libc.h> # define _PATH_MAILDIR "/usr/spool/mail" @@ -160,10 +148,6 @@ extern size_t strlcat __P((char *, const char *, size_t)); # define LOCK_EX F_LOCK # endif /* USE_LOCKF */ -# ifndef USE_VSYSLOG -# define USE_VSYSLOG 1 -# endif /* ! USE_VSYSLOG */ - # ifndef LOCK_EX # include <sys/file.h> # endif /* ! LOCK_EX */ @@ -205,18 +189,19 @@ extern FILE *fdopen __P((int, const char *)); # define HASSNPRINTF 1 /* has snprintf starting in 4.3 */ # endif /* _AIX4 >= 40300 */ -# if !HASSNPRINTF +# if !HASSNPRINTF && !SFIO extern int snprintf __P((char *, size_t, const char *, ...)); # ifndef _CRAY extern int vsnprintf __P((char *, size_t, const char *, ...)); # endif /* ! _CRAY */ -# endif /* !HASSNPRINTF */ +# endif /* !HASSNPRINTF && !SFIO */ /* ** If you don't have setreuid, and you have saved uids, and you have ** a seteuid() call that doesn't try to emulate using setuid(), then ** you can try defining USE_SETEUID. */ + # ifdef USE_SETEUID # define setreuid(r, e) seteuid(e) # endif /* USE_SETEUID */ @@ -224,6 +209,7 @@ extern int vsnprintf __P((char *, size_t, const char *, ...)); /* ** And of course on hpux you have setresuid() */ + # ifdef USE_SETRESUID # define setreuid(r, e) setresuid(-1, e, -1) # endif /* USE_SETRESUID */ @@ -261,19 +247,21 @@ off_t BodyLength; #endif /* CONTENTLENGTH */ bool EightBitMime = TRUE; /* advertise 8BITMIME in LMTP */ +char ErrBuf[10240]; /* error buffer */ int ExitVal = EX_OK; /* sysexits.h error value. */ +bool HoldErrs = FALSE; /* Hold errors in ErrBuf */ bool LMTPMode = FALSE; -bool bouncequota = FALSE; /* permanent error when over quota */ +bool BounceQuota = FALSE; /* permanent error when over quota */ -void deliver __P((int, char *, bool)); +void deliver __P((int, char *)); int e_to_sys __P((int)); void notifybiff __P((char *)); -int store __P((char *, int)); +int store __P((char *, int, bool *)); void usage __P((void)); -void vwarn __P((const char *, _BSD_VA_LIST_)); int lockmbox __P((char *)); void unlockmbox __P((void)); void mailerr __P((const char *, const char *, ...)); +void flush_error __P((void)); int @@ -287,7 +275,6 @@ main(argc, argv) char *from; extern char *optarg; extern int optind; - extern void dolmtp __P((bool)); /* make sure we have some open file descriptors */ @@ -313,7 +300,7 @@ main(argc, argv) break; case 'b': /* bounce mail when over quota. */ - bouncequota = TRUE; + BounceQuota = TRUE; break; case 'd': /* Backward compatible. */ @@ -323,7 +310,7 @@ main(argc, argv) case 'r': /* Backward compatible. */ if (from != NULL) { - mailerr(NULL, "multiple -f options"); + mailerr(NULL, "Multiple -f options"); usage(); } from = optarg; @@ -345,8 +332,21 @@ main(argc, argv) notifybiff(NULL); if (LMTPMode) - dolmtp(bouncequota); + { + extern void dolmtp __P((void)); + if (argc > 0) + { + mailerr("421", "Users should not be specified in command line if LMTP required"); + exit(EX_TEMPFAIL); + } + + dolmtp(); + /* NOTREACHED */ + exit(EX_OK); + } + + /* Non-LMTP from here on out */ if (*argv == '\0') usage(); @@ -355,6 +355,7 @@ main(argc, argv) ** uid matches, otherwise, use the name from the password file ** corresponding to the uid. */ + uid = getuid(); if (from == NULL && ((from = getlogin()) == NULL || @@ -371,8 +372,17 @@ main(argc, argv) ** failures. This results in the delivery being reattempted later ** at the expense of repeated failures and multiple deliveries. */ - for (fd = store(from, 0); *argv; ++argv) - deliver(fd, *argv, bouncequota); + + HoldErrs = TRUE; + fd = store(from, 0, NULL); + HoldErrs = FALSE; + if (fd < 0) + { + flush_error(); + exit(ExitVal); + } + for (; *argv != NULL; ++argv) + deliver(fd, *argv); exit(ExitVal); /* NOTREACHED */ return ExitVal; @@ -460,7 +470,7 @@ parseaddr(s, rcpt) p = malloc(l); if (p == NULL) { - printf("421 4.3.0 memory exhausted\r\n"); + mailerr("421 4.3.0", "Memory exhausted"); exit(EX_TEMPFAIL); } @@ -473,15 +483,14 @@ process_recipient(addr) char *addr; { if (getpwnam(addr) == NULL) - return "550 5.1.1 user unknown"; + return "550 5.1.1 User unknown"; return NULL; } #define RCPT_GROW 30 void -dolmtp(bouncequota) - bool bouncequota; +dolmtp() { char *return_path = NULL; char **rcpt_addr = NULL; @@ -495,7 +504,10 @@ dolmtp(bouncequota) char myhostname[1024]; char buf[4096]; + memset(myhostname, '\0', sizeof myhostname); (void) gethostname(myhostname, sizeof myhostname - 1); + if (myhostname[0] == '\0') + strlcpy(myhostname, "localhost", sizeof myhostname); printf("220 %s LMTP ready\r\n", myhostname); for (;;) @@ -515,24 +527,37 @@ dolmtp(bouncequota) case 'D': if (strcasecmp(buf, "data") == 0) { + bool inbody = FALSE; + if (rcpt_num == 0) { - printf("503 5.5.1 No recipients\r\n"); + mailerr("503 5.5.1", "No recipients"); continue; } - msgfd = store(return_path, rcpt_num); - if (msgfd == -1) + HoldErrs = TRUE; + msgfd = store(return_path, rcpt_num, &inbody); + HoldErrs = FALSE; + if (msgfd < 0 && !inbody) + { + flush_error(); continue; + } for (i = 0; i < rcpt_num; i++) { + if (msgfd < 0) + { + /* print error for rcpt */ + flush_error(); + continue; + } p = strchr(rcpt_addr[i], '+'); if (p != NULL) - *p++ = '\0'; - deliver(msgfd, rcpt_addr[i], - bouncequota); + *p = '\0'; + deliver(msgfd, rcpt_addr[i]); } - (void) close(msgfd); + if (msgfd >= 0) + (void) close(msgfd); goto rset; } goto syntaxerr; @@ -546,7 +571,7 @@ dolmtp(bouncequota) /* check for duplicate per RFC 1651 4.2 */ if (gotlhlo) { - printf("503 %s Duplicate LHLO\r\n", + mailerr("503", "%s Duplicate LHLO", myhostname); continue; } @@ -568,17 +593,19 @@ dolmtp(bouncequota) { if (return_path != NULL) { - printf("503 5.5.1 Nested MAIL command\r\n"); + mailerr("503 5.5.1", + "Nested MAIL command"); continue; } if (strncasecmp(buf+5, "from:", 5) != 0 || ((return_path = parseaddr(buf + 10, FALSE)) == NULL)) { - printf("501 5.5.4 Syntax error in parameters\r\n"); + mailerr("501 5.5.4", + "Syntax error in parameters"); continue; } - printf("250 2.5.0 ok\r\n"); + printf("250 2.5.0 Ok\r\n"); continue; } goto syntaxerr; @@ -589,7 +616,7 @@ dolmtp(bouncequota) case 'N': if (strcasecmp(buf, "noop") == 0) { - printf("250 2.0.0 ok\r\n"); + printf("250 2.0.0 Ok\r\n"); continue; } goto syntaxerr; @@ -600,7 +627,7 @@ dolmtp(bouncequota) case 'Q': if (strcasecmp(buf, "quit") == 0) { - printf("221 2.0.0 bye\r\n"); + printf("221 2.0.0 Bye\r\n"); exit(EX_OK); } goto syntaxerr; @@ -613,7 +640,8 @@ dolmtp(bouncequota) { if (return_path == NULL) { - printf("503 5.5.1 Need MAIL command\r\n"); + mailerr("503 5.5.1", + "Need MAIL command"); continue; } if (rcpt_num >= rcpt_alloc) @@ -625,7 +653,8 @@ dolmtp(bouncequota) sizeof(char **)); if (rcpt_addr == NULL) { - printf("421 4.3.0 memory exhausted\r\n"); + mailerr("421 4.3.0", + "Memory exhausted"); exit(EX_TEMPFAIL); } } @@ -633,21 +662,23 @@ dolmtp(bouncequota) ((rcpt_addr[rcpt_num] = parseaddr(buf + 8, TRUE)) == NULL)) { - printf("501 5.5.4 Syntax error in parameters\r\n"); + mailerr("501 5.5.4", + "Syntax error in parameters"); continue; } - if ((err = process_recipient(rcpt_addr[rcpt_num])) != NULL) + err = process_recipient(rcpt_addr[rcpt_num]); + if (err != NULL) { - printf("%s\r\n", err); + mailerr(NULL, "%s", err); continue; } rcpt_num++; - printf("250 2.1.5 ok\r\n"); + printf("250 2.1.5 Ok\r\n"); continue; } else if (strcasecmp(buf, "rset") == 0) { - printf("250 2.0.0 ok\r\n"); + printf("250 2.0.0 Ok\r\n"); rset: while (rcpt_num > 0) @@ -665,7 +696,7 @@ rset: case 'V': if (strncasecmp(buf, "vrfy ", 5) == 0) { - printf("252 2.3.3 try RCPT to attempt delivery\r\n"); + printf("252 2.3.3 Try RCPT to attempt delivery\r\n"); continue; } goto syntaxerr; @@ -674,7 +705,7 @@ rset: default: syntaxerr: - printf("500 5.5.2 Syntax error\r\n"); + mailerr("500 5.5.2", "Syntax error"); continue; /* NOTREACHED */ break; @@ -683,9 +714,10 @@ rset: } int -store(from, lmtprcpts) +store(from, lmtprcpts, inbody) char *from; int lmtprcpts; + bool *inbody; { FILE *fp = NULL; time_t tval; @@ -696,28 +728,25 @@ store(from, lmtprcpts) int fd; char tmpbuf[sizeof _PATH_LOCTMP + 1]; + if (inbody != NULL) + *inbody = FALSE; + (void) umask(0077); (void) strlcpy(tmpbuf, _PATH_LOCTMP, sizeof tmpbuf); - if ((fd = mkstemp(tmpbuf)) == -1 || (fp = fdopen(fd, "w+")) == NULL) + if ((fd = mkstemp(tmpbuf)) < 0 || (fp = fdopen(fd, "w+")) == NULL) { - if (lmtprcpts) - { - printf("451 4.3.0 unable to open temporary file\r\n"); - return -1; - } - else - { - mailerr("451 4.3.0", "unable to open temporary file"); - exit(ExitVal); - } + mailerr("451 4.3.0", "Unable to open temporary file"); + return -1; } (void) unlink(tmpbuf); if (LMTPMode) { - printf("354 go ahead\r\n"); + printf("354 Go ahead\r\n"); (void) fflush(stdout); } + if (inbody != NULL) + *inbody = TRUE; (void) time(&tval); (void) fprintf(fp, "From %s %s", from, ctime(&tval)); @@ -729,7 +758,7 @@ store(from, lmtprcpts) line[0] = '\0'; eline = TRUE; - while (fgets(line, sizeof(line), stdin) != (char *)NULL) + while (fgets(line, sizeof(line), stdin) != (char *) NULL) { size_t line_len = 0; int peek; @@ -740,7 +769,7 @@ store(from, lmtprcpts) line_len++; /* Check for dot-stuffing */ - if (prevfl && lmtprcpts && line[0] == '.') + if (prevfl && LMTPMode && line[0] == '.') { if (line[1] == '\n' || (line[1] == '\r' && line[2] == '\n')) @@ -784,7 +813,8 @@ store(from, lmtprcpts) if (prevfl && line[0] == '\n' && HeaderLength == 0) { eline = FALSE; - HeaderLength = ftell(fp); + if (fp != NULL) + HeaderLength = ftell(fp); if (HeaderLength <= 0) { /* @@ -802,6 +832,7 @@ store(from, lmtprcpts) else { if (eline && line[0] == 'F' && + fp != NULL && !memcmp(line, "From ", 5)) (void) putc('>', fp); eline = FALSE; @@ -821,40 +852,39 @@ store(from, lmtprcpts) #endif /* CONTENTLENGTH */ } - (void) fwrite(line, sizeof(char), line_len, fp); - if (ferror(fp)) + if (fp != NULL) { - if (lmtprcpts) - { - while (lmtprcpts--) - printf("451 4.3.0 temporary file write error\r\n"); - (void) fclose(fp); - return -1; - } - else + (void) fwrite(line, sizeof(char), line_len, fp); + if (ferror(fp)) { mailerr("451 4.3.0", - "temporary file write error"); + "Temporary file write error"); (void) fclose(fp); - exit(ExitVal); + fp = NULL; + continue; } } } - if (lmtprcpts) + /* check if an error occurred */ + if (fp == NULL) + return -1; + + if (LMTPMode) { /* Got a premature EOF -- toss message and exit */ exit(EX_OK); } /* If message not newline terminated, need an extra. */ - if (strchr(line, '\n') == NULL) + if (fp != NULL && strchr(line, '\n') == NULL) (void) putc('\n', fp); lmtpdot: #ifdef CONTENTLENGTH - BodyLength = ftell(fp); + if (fp != NULL) + BodyLength = ftell(fp); if (HeaderLength == 0 && BodyLength > 0) /* empty body */ { HeaderLength = BodyLength; @@ -880,32 +910,23 @@ store(from, lmtprcpts) #endif /* CONTENTLENGTH */ /* Output a newline; note, empty messages are allowed. */ - (void) putc('\n', fp); + if (fp != NULL) + (void) putc('\n', fp); - if (fflush(fp) == EOF || ferror(fp) != 0) + if (fp == NULL || fflush(fp) == EOF || ferror(fp) != 0) { - if (lmtprcpts) - { - while (lmtprcpts--) - printf("451 4.3.0 temporary file write error\r\n"); - (void) fclose(fp); - return -1; - } - else - { - mailerr("451 4.3.0", "temporary file write error"); + mailerr("451 4.3.0", "Temporary file write error"); + if (fp != NULL) (void) fclose(fp); - exit(ExitVal); - } + return -1; } return fd; } void -deliver(fd, name, bouncequota) +deliver(fd, name) int fd; char *name; - bool bouncequota; { struct stat fsb; struct stat sb; @@ -913,6 +934,7 @@ deliver(fd, name, bouncequota) char path[MAXPATHLEN]; int mbfd = -1, nr = 0, nw, off; char *p; + char *errcode; off_t curoff; #ifdef CONTENTLENGTH off_t headerbytes; @@ -926,28 +948,17 @@ deliver(fd, name, bouncequota) ** Disallow delivery to unknown names -- special mailboxes can be ** handled in the sendmail aliases file. */ + if ((pw = getpwnam(name)) == NULL) { - if (ExitVal != EX_TEMPFAIL) - ExitVal = EX_UNAVAILABLE; - if (LMTPMode) - { - if (ExitVal == EX_TEMPFAIL) - printf("451 4.3.0 cannot lookup name: %s\r\n", - name); - else - printf("550 5.1.1 unknown name: %s\r\n", name); - } + if (ExitVal == EX_TEMPFAIL) + errcode = "451 4.3.0"; else { - char *errcode = NULL; - - if (ExitVal == EX_TEMPFAIL) - errcode = "451 4.3.0"; - else - errcode = "550 5.1.1"; - mailerr(errcode, "unknown name: %s", name); + ExitVal = EX_UNAVAILABLE; + errcode = "550 5.1.1"; } + mailerr(errcode, "Unknown name: %s", name); return; } endpwent(); @@ -1007,16 +1018,13 @@ tryagain: if (off == EX_TEMPFAIL || e_to_sys(off) == EX_TEMPFAIL) { ExitVal = EX_TEMPFAIL; - mailerr("451 4.3.0", - "lockmailbox %s failed; error code %d %s", - p, off, errno > 0 ? errstring(errno) : ""); + errcode = "451 4.3.0"; } else - { - mailerr("551 5.3.0", - "lockmailbox %s failed; error code %d %s", - p, off, errno > 0 ? errstring(errno) : ""); - } + errcode = "551 5.3.0"; + + mailerr(errcode, "lockmailbox %s failed; error code %d %s", + p, off, errno > 0 ? errstring(errno) : ""); return; } @@ -1043,7 +1051,7 @@ tryagain: "%s: lstat: file changed after open", path); goto err1; } - if (mbfd == -1) + if (mbfd < 0) { if (save_errno == EEXIST) goto tryagain; @@ -1128,7 +1136,7 @@ tryagain: } /* Get the starting offset of the new message for biff. */ - curoff = lseek(mbfd, (off_t)0, SEEK_END); + curoff = lseek(mbfd, (off_t) 0, SEEK_END); if (sizeof curoff > sizeof(long)) (void) snprintf(biffmsg, sizeof(biffmsg), "%s@%s\n", name, quad_to_string(curoff)); @@ -1137,9 +1145,9 @@ tryagain: name, (long) curoff); /* Copy the message into the file. */ - if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) + if (lseek(fd, (off_t) 0, SEEK_SET) == (off_t) -1) { - mailerr("450 4.2.0", "temporary file: %s", + mailerr("450 4.2.0", "Temporary file: %s", errstring(errno)); goto err1; } @@ -1176,13 +1184,12 @@ tryagain: { if ((nw = write(mbfd, buf + off, nr - off)) < 0) { + errcode = "450 4.2.0"; #ifdef EDQUOT - if (errno == EDQUOT && bouncequota) - mailerr("552 5.2.2", "%s: %s", - path, errstring(errno)); - else + if (errno == EDQUOT && BounceQuota) + errcode = "552 5.2.2"; #endif /* EDQUOT */ - mailerr("450 4.2.0", "%s: %s", + mailerr(errcode, "%s: %s", path, errstring(errno)); goto err3; } @@ -1190,7 +1197,7 @@ tryagain: } if (nr < 0) { - mailerr("450 4.2.0", "temporary file: %s", + mailerr("450 4.2.0", "Temporary file: %s", errstring(errno)); goto err3; } @@ -1200,15 +1207,7 @@ tryagain: { mailerr("450 4.2.0", "%s: %s", path, errstring(errno)); err3: - if (setreuid(0, 0) < 0) - { -#if 0 - /* already printed an error above for this recipient */ - (void) e_to_sys(errno); - mailerr("450 4.2.0", "setreuid(0, 0): %s", - errstring(errno)); -#endif /* 0 */ - } + (void) setreuid(0, 0); #ifdef DEBUG fprintf(stderr, "reset euid = %d\n", geteuid()); #endif /* DEBUG */ @@ -1222,12 +1221,12 @@ err0: unlockmbox(); /* Close and check -- NFS doesn't write until the close. */ if (close(mbfd)) { + errcode = "450 4.2.0"; #ifdef EDQUOT - if (errno == EDQUOT && bouncequota) - mailerr("552 5.2.2", "%s: %s", path, errstring(errno)); - else + if (errno == EDQUOT && BounceQuota) + errcode = "552 5.2.2"; #endif /* EDQUOT */ - mailerr("450 4.2.0", "%s: %s", path, errstring(errno)); + mailerr(errcode, "%s: %s", path, errstring(errno)); (void) truncate(path, curoff); } else @@ -1244,7 +1243,7 @@ err0: unlockmbox(); #endif /* DEBUG */ unlockmbox(); if (LMTPMode) - printf("250 2.1.5 %s OK\r\n", name); + printf("250 2.1.5 %s Ok\r\n", name); } /* @@ -1399,7 +1398,7 @@ notifybiff(msg) if (addr.sin_family == AF_UNSPEC) return; - if (f < 0 && (f = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + if (f < 0 && (f = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return; len = strlen(msg) + 1; (void) sendto(f, msg, len, 0, (struct sockaddr *) &addr, sizeof(addr)); @@ -1423,61 +1422,53 @@ mailerr(hdr, fmt, va_alist) va_dcl #endif /* __STDC__ */ { + size_t len = 0; va_list ap; + (void) e_to_sys(errno); + #ifdef __STDC__ va_start(ap, fmt); #else /* __STDC__ */ va_start(ap); #endif /* __STDC__ */ + if (LMTPMode) { if (hdr != NULL) - printf("%s ", hdr); - (void) vprintf(fmt, ap); - (void) printf("\r\n"); - } - else - { - (void) e_to_sys(errno); - vwarn(fmt, ap); + { + snprintf(ErrBuf, sizeof ErrBuf, "%s ", hdr); + len = strlen(ErrBuf); + } } + (void) vsnprintf(&ErrBuf[len], sizeof ErrBuf - len, fmt, ap); + + if (!HoldErrs) + flush_error(); + + /* Log the message to syslog. */ + if (!LMTPMode) + syslog(LOG_ERR, "%s", ErrBuf); } void -vwarn(fmt, ap) - const char *fmt; - _BSD_VA_LIST_ ap; +flush_error() { - /* - ** Log the message to stderr. - ** - ** Don't use LOG_PERROR as an openlog() flag to do this, - ** it's not portable enough. - */ - - if (ExitVal != EX_USAGE) - (void) fprintf(stderr, "mail.local: "); - (void) vfprintf(stderr, fmt, ap); - (void) fprintf(stderr, "\n"); - -#if USE_VSYSLOG - /* Log the message to syslog. */ - vsyslog(LOG_ERR, fmt, ap); -#else /* USE_VSYSLOG */ + if (LMTPMode) + printf("%s\r\n", ErrBuf); + else { - char fmtbuf[10240]; - - (void) vsnprintf(fmtbuf, sizeof fmtbuf, fmt, ap); - syslog(LOG_ERR, "%s", fmtbuf); + if (ExitVal != EX_USAGE) + (void) fprintf(stderr, "mail.local: "); + fprintf(stderr, "%s\n", ErrBuf); } -#endif /* USE_VSYSLOG */ } /* * e_to_sys -- * Guess which errno's are temporary. Gag me. */ + int e_to_sys(num) int num; @@ -1490,7 +1481,7 @@ e_to_sys(num) { #ifdef EDQUOT case EDQUOT: /* Disc quota exceeded */ - if (bouncequota) + if (BounceQuota) { ExitVal = EX_UNAVAILABLE; break; @@ -1631,15 +1622,6 @@ mkstemp(path) return (_gettemp(path, &fd) ? fd : -1); } -# if 0 -char * -mktemp(path) - char *path; -{ - return(_gettemp(path, (int *)NULL) ? path : (char *)NULL); -} -# endif /* 0 */ - static _gettemp(path, doopen) char *path; diff --git a/gnu/usr.sbin/sendmail/mailstats/mailstats.c b/gnu/usr.sbin/sendmail/mailstats/mailstats.c index 33cc299aed0..3e2b0a84ec1 100644 --- a/gnu/usr.sbin/sendmail/mailstats/mailstats.c +++ b/gnu/usr.sbin/sendmail/mailstats/mailstats.c @@ -21,7 +21,7 @@ static char copyright[] = #endif /* ! lint */ #ifndef lint -static char id[] = "@(#)$Sendmail: mailstats.c,v 8.53.16.11 2000/09/17 17:04:26 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: mailstats.c,v 8.53.16.12 2001/02/15 20:52:36 geir Exp $"; #endif /* ! lint */ #include <unistd.h> diff --git a/gnu/usr.sbin/sendmail/praliases/praliases.c b/gnu/usr.sbin/sendmail/praliases/praliases.c index 0b5ab03076b..5c87338a753 100644 --- a/gnu/usr.sbin/sendmail/praliases/praliases.c +++ b/gnu/usr.sbin/sendmail/praliases/praliases.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,7 +13,7 @@ #ifndef lint static char copyright[] = -"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\ +"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\ All rights reserved.\n\ Copyright (c) 1983 Eric P. Allman. All rights reserved.\n\ Copyright (c) 1988, 1993\n\ @@ -21,7 +21,7 @@ static char copyright[] = #endif /* ! lint */ #ifndef lint -static char id[] = "@(#)$Sendmail: praliases.c,v 8.59.4.15 2000/10/24 00:42:59 geir Exp $"; +static char id[] = "@(#)$Sendmail: praliases.c,v 8.59.4.18 2001/01/22 19:00:18 gshapiro Exp $"; #endif /* ! lint */ #include <sys/types.h> @@ -272,6 +272,21 @@ praliases(filename, argc, argv) db_name++; } + /* Skip non-file based DB types */ + if (db_type != NULL && *db_type != '\0') + { + if (db_type != SMDB_TYPE_DEFAULT && + strcmp(db_type, "hash") != 0 && + strcmp(db_type, "btree") != 0 && + strcmp(db_type, "dbm") != 0) + { + fprintf(stderr, + "praliases: Skipping non-file based alias type %s\n", + db_type); + return; + } + } + if (*db_name == '\0' || (db_type != NULL && *db_type == '\0')) { if (colon != NULL) diff --git a/gnu/usr.sbin/sendmail/rmail/rmail.c b/gnu/usr.sbin/sendmail/rmail/rmail.c index 1d512d343b9..8256468a6a9 100644 --- a/gnu/usr.sbin/sendmail/rmail/rmail.c +++ b/gnu/usr.sbin/sendmail/rmail/rmail.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. @@ -19,7 +19,7 @@ static char copyright[] = #endif /* ! lint */ #ifndef lint -static char id[] = "@(#)$Sendmail: rmail.c,v 8.39.4.9 2000/11/17 08:42:56 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: rmail.c,v 8.39.4.11 2001/02/14 04:07:25 gshapiro Exp $"; #endif /* ! lint */ /* @@ -97,9 +97,9 @@ static char id[] = "@(#)$Sendmail: rmail.c,v 8.39.4.9 2000/11/17 08:42:56 gshapi # define memmove(d, s, l) (bcopy((s), (d), (l))) #endif /* defined(sun) && !defined(BSD) && !defined(SOLARIS) && !defined(__svr4__) && !defined(__SVR4) */ -#if !HASSNPRINTF +#if !HASSNPRINTF && !SFIO extern int snprintf __P((char *, size_t, const char *, ...)); -#endif /* !HASSNPRINTF */ +#endif /* !HASSNPRINTF && !SFIO */ #if defined(BSD4_4) || defined(__osf__) || defined(__GNU_LIBRARY__) || defined(IRIX64) || defined(IRIX5) || defined(IRIX6) # ifndef HASSTRERROR diff --git a/gnu/usr.sbin/sendmail/sendmail/README b/gnu/usr.sbin/sendmail/sendmail/README index fff7e9c93da..6fd15db5f9b 100644 --- a/gnu/usr.sbin/sendmail/sendmail/README +++ b/gnu/usr.sbin/sendmail/sendmail/README @@ -1,4 +1,4 @@ -# Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. # Copyright (c) 1988 @@ -9,7 +9,7 @@ # the sendmail distribution. # # -# $Sendmail: README,v 8.263.2.1.2.27 2000/12/16 16:46:02 gshapiro Exp $ +# $Sendmail: README,v 8.263.2.1.2.32 2001/01/29 23:45:22 gshapiro Exp $ # This directory contains the source files for sendmail(TM). @@ -631,9 +631,10 @@ YOU HEADACHES! When attempting to canonify a hostname, some broken name servers will return SERVFAIL (a temporary failure) on T_AAAA (IPv6) lookups. If you want to excuse this behavior, compile sendmail with --D_FFR_WORKAROUND_BROKEN_NAMESERVERS. However, instead, we recommend catching -the problem and reporting it to the name server administrator so we can rid -the world of broken name servers. +-D_FFR_WORKAROUND_BROKEN_NAMESERVERS and add WorkAroundBrokenAAAA to your +ResolverOptions setting. However, instead, we recommend catching the +problem and reporting it to the name server administrator so we can rid the +world of broken name servers. +----------------------------------------+ | STARTTLS COMPILATION AND CONFIGURATION | @@ -1038,6 +1039,12 @@ IRIX 6.x If you are using XFS filesystem, avoid using the -32 ABI switch to the cc compiler if possible. + Broken inet_aton and inet_ntoa on IRIX using gcc: There's + a problem with gcc on IRIX, i.e., gcc can't pass structs + less than 16 bits long unless they are 8 bits; IRIX 6.2 has + some other sized structs. See + http://www.bitmechanic.com/mail-archives/mysql/current/0418.html + IRIX 6.4 The IRIX 6.5.4 version of /bin/m4 does not work properly with sendmail. Either install fw_m4.sw.m4 off the Freeware_May99 CD and @@ -1096,8 +1103,10 @@ BSDI (BSD/386) 1.0, NetBSD 0.9, FreeBSD 1.0 determined to continue to use your old, buggy version (or as a shortcut to get sendmail working -- I'm sure you have the best intentions to port a modern version of BIND), you can - copy ../contrib/oldbind.compat.c into sendmail and add - oldbind.compat.o to OBJADD in the Makefile. + copy ../contrib/oldbind.compat.c into sendmail and add the + following to devtools/Site/site.config.m4: + + APPENDDEF(`confOBJADD', `oldbind.compat.o') A/UX Date: Tue, 12 Oct 1993 18:28:28 -0400 (EDT) @@ -1236,6 +1245,17 @@ Linux "#include <syslog.h>" to the SFIO version of stdio.h as the very first line. +glibc + glibc 2.2.1 (and possibly other versions) changed the value of + __RES in resolv.h but failed to actually provide the IPv6 API + changes that the change implied. Therefore, compiling with + -DNETINET6 fails. + + Workarounds: + 1) Compile without -DNETINET6 + 2) Build against a real BIND 8.2.2 include/lib tree + 3) Wait for glibc to fix it + AIX 4.X The AIX 4.X linker uses library paths specified during compilation using -L for run-time shared library searches. Therefore, it is @@ -1268,7 +1288,7 @@ AIX 4.3.3 Workarounds: 1) Compile without -DNETINET6 - 2) Build against a real Bind 8.2.2 include/lib tree + 2) Build against a real BIND 8.2.2 include/lib tree 3) Wait for IBM to fix it AIX 4.X @@ -1668,4 +1688,4 @@ util.c Some general purpose routines used by sendmail. version.c The version number and information about this version of sendmail. -(Version $Revision: 1.4 $, last update $Date: 2001/01/15 21:09:06 $ ) +(Version $Revision: 1.5 $, last update $Date: 2001/02/28 02:43:53 $ ) diff --git a/gnu/usr.sbin/sendmail/sendmail/bf.h b/gnu/usr.sbin/sendmail/sendmail/bf.h index 3e347ccc866..dc63fd2082f 100644 --- a/gnu/usr.sbin/sendmail/sendmail/bf.h +++ b/gnu/usr.sbin/sendmail/sendmail/bf.h @@ -1,12 +1,12 @@ /* - * Copyright (c) 1999 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999, 2001 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. * - * $Sendmail: bf.h,v 8.5 1999/11/04 19:31:25 ca Exp $ + * $Sendmail: bf.h,v 8.5.16.2 2001/02/14 04:07:27 gshapiro Exp $ * * Contributed by Exactis.com, Inc. * @@ -20,6 +20,7 @@ extern FILE *bfdup __P((FILE *)); extern int bfcommit __P((FILE *)); extern int bfrewind __P((FILE *)); extern int bftruncate __P((FILE *)); +extern int bffsync __P((FILE *)); extern int bfclose __P((FILE *)); extern bool bftest __P((FILE *)); diff --git a/gnu/usr.sbin/sendmail/sendmail/bf_portable.c b/gnu/usr.sbin/sendmail/sendmail/bf_portable.c index 24b0d3e146f..19a275f15c3 100644 --- a/gnu/usr.sbin/sendmail/sendmail/bf_portable.c +++ b/gnu/usr.sbin/sendmail/sendmail/bf_portable.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -11,7 +11,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: bf_portable.c,v 8.25.4.3 2000/06/29 21:21:58 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: bf_portable.c,v 8.25.4.5 2001/02/14 04:07:27 gshapiro Exp $"; #endif /* ! lint */ #if SFIO @@ -283,6 +283,47 @@ bftruncate(fp) } /* +** BFFSYNC -- fsync the fd associated with the FILE * +** +** Parameters: +** fp -- FILE * to fsync +** +** Returns: +** 0 on success, -1 on error +** +** Sets errno: +** EINVAL if FILE * not bfcommitted yet. +** any value of errno specified by fsync() +*/ + +int +bffsync(fp) + FILE *fp; +{ + int fd; + struct bf *bfp; + + /* Get associated bf structure */ + bfp = bflookup(fp); + + /* If called on a normal FILE *, noop */ + if (bfp != NULL && !bfp->bf_committed) + fd = -1; + else + fd = fileno(fp); + + if (tTd(58, 10)) + dprintf("bffsync: fd = %d\n", fd); + + if (fd < 0) + { + errno = EINVAL; + return -1; + } + return fsync(fd); +} + +/* ** BFCLOSE -- close a buffered file ** ** Parameters: diff --git a/gnu/usr.sbin/sendmail/sendmail/bf_torek.c b/gnu/usr.sbin/sendmail/sendmail/bf_torek.c index 272511bc0b2..5d6923bee09 100644 --- a/gnu/usr.sbin/sendmail/sendmail/bf_torek.c +++ b/gnu/usr.sbin/sendmail/sendmail/bf_torek.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -11,7 +11,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: bf_torek.c,v 8.19.18.2 2000/09/17 17:04:26 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: bf_torek.c,v 8.19.18.4 2001/02/14 04:07:27 gshapiro Exp $"; #endif /* ! lint */ #if SFIO @@ -381,6 +381,51 @@ bftruncate(fp) } /* +** BFFSYNC -- fsync the fd associated with the FILE * +** +** Parameters: +** fp -- FILE * to fsync +** +** Returns: +** 0 on success, -1 on error +** +** Sets errno: +** EINVAL if FILE * not bfcommitted yet. +** any value of errno specified by fsync() +*/ + +int +bffsync(fp) + FILE *fp; +{ + int fd; + struct bf *bfp; + + if (bftest(fp)) + { + /* Get bf structure */ + bfp = (struct bf *)fp->_cookie; + + if (bfp->bf_ondisk && bfp->bf_committed) + fd = bfp->bf_disk_fd; + else + fd = -1; + } + else + fd = fileno(fp); + + if (tTd(58, 10)) + dprintf("bffsync: fd = %d\n", fd); + + if (fd < 0) + { + errno = EINVAL; + return -1; + } + return fsync(fd); +} + +/* ** BFCLOSE -- close a buffered file ** ** Parameters: diff --git a/gnu/usr.sbin/sendmail/sendmail/collect.c b/gnu/usr.sbin/sendmail/sendmail/collect.c index 0c6bd881da2..47e51a99fc4 100644 --- a/gnu/usr.sbin/sendmail/sendmail/collect.c +++ b/gnu/usr.sbin/sendmail/sendmail/collect.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: collect.c,v 8.136.4.8 2000/10/09 00:50:04 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: collect.c,v 8.136.4.15 2001/02/21 01:05:59 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -84,7 +84,6 @@ collect(fp, smtpmode, hdrp, e) volatile int hdrslen = 0; volatile int numhdrs = 0; volatile int dfd; - volatile int afd; volatile int rstat = EX_OK; u_char *volatile pbp; u_char peekbuf[8]; @@ -102,6 +101,8 @@ collect(fp, smtpmode, hdrp, e) if (!headeronly) { struct stat stbuf; + long sff = SFF_OPENASROOT; + (void) strlcpy(dfname, queuename(e, 'd'), sizeof dfname); #if _FFR_QUEUE_FILE_MODE @@ -110,18 +111,21 @@ collect(fp, smtpmode, hdrp, e) if (bitset(S_IWGRP, QueueFileMode)) oldumask = umask(002); - df = bfopen(dfname, QueueFileMode, DataFileBufferSize, - SFF_OPENASROOT); + df = bfopen(dfname, QueueFileMode, + DataFileBufferSize, sff); if (bitset(S_IWGRP, QueueFileMode)) (void) umask(oldumask); } #else /* _FFR_QUEUE_FILE_MODE */ - df = bfopen(dfname, FileMode, DataFileBufferSize, - SFF_OPENASROOT); + df = bfopen(dfname, FileMode, DataFileBufferSize, sff); #endif /* _FFR_QUEUE_FILE_MODE */ if (df == NULL) { - syserr("Cannot create %s", dfname); + HoldErrs = FALSE; + if (smtpmode) + syserr("421 4.3.5 Unable to create data file"); + else + syserr("Cannot create %s", dfname); e->e_flags |= EF_NO_BODY_RETN; finis(TRUE, ExitStat); /* NOTREACHED */ @@ -346,8 +350,9 @@ bufferchar: else if (c != '\0') { *bp++ = c; + hdrslen++; if (MaxHeadersLength > 0 && - ++hdrslen > MaxHeadersLength) + hdrslen > MaxHeadersLength) { sm_syslog(LOG_NOTICE, e->e_id, "headers too large (%d max) from %s during message collect", @@ -496,13 +501,6 @@ readerr: /* skip next few clauses */ /* EMPTY */ } - else if ((afd = fileno(df)) >= 0 && fsync(afd) < 0) - { - dferror(df, "fsync", e); - flush_errors(TRUE); - finis(TRUE, ExitStat); - /* NOTREACHED */ - } else if (bfcommit(df) < 0) { int save_errno = errno; @@ -527,6 +525,13 @@ readerr: flush_errors(TRUE); finis(save_errno != EEXIST, ExitStat); } + else if (bffsync(df) < 0) + { + dferror(df, "bffsync", e); + flush_errors(TRUE); + finis(TRUE, ExitStat); + /* NOTREACHED */ + } else if (bfclose(df) < 0) { dferror(df, "bfclose", e); diff --git a/gnu/usr.sbin/sendmail/sendmail/conf.c b/gnu/usr.sbin/sendmail/sendmail/conf.c index 52d364b6af4..da6dda31e06 100644 --- a/gnu/usr.sbin/sendmail/sendmail/conf.c +++ b/gnu/usr.sbin/sendmail/sendmail/conf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: conf.c,v 8.646.2.2.2.61 2000/12/28 23:46:41 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: conf.c,v 8.646.2.2.2.69 2001/02/27 19:50:11 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -4358,7 +4358,7 @@ getipnodebyname(name, family, flags, err) resv6 = bitset(RES_USE_INET6, _res.options); _res.options |= RES_USE_INET6; } - h_errno = 0; + SM_SET_H_ERRNO(0); h = gethostbyname(name); *err = h_errno; if (family == AF_INET6 && !resv6) @@ -4375,7 +4375,7 @@ getipnodebyaddr(addr, len, family, err) { struct hostent *h; - h_errno = 0; + SM_SET_H_ERRNO(0); h = gethostbyaddr(addr, len, family); *err = h_errno; return h; @@ -4401,6 +4401,7 @@ sm_gethostbyname(name, family) char *name; int family; { + int save_errno; struct hostent *h = NULL; #if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) # if SOLARIS == 20300 || SOLARIS == 203 @@ -4411,12 +4412,14 @@ sm_gethostbyname(name, family) if (tTd(61, 10)) dprintf("_switch_gethostbyname_r(%s)... ", name); h = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno); + save_errno = errno; # else /* SOLARIS == 20300 || SOLARIS == 203 */ extern struct hostent *__switch_gethostbyname(); if (tTd(61, 10)) dprintf("__switch_gethostbyname(%s)... ", name); h = __switch_gethostbyname(name); + save_errno = errno; # endif /* SOLARIS == 20300 || SOLARIS == 203 */ #else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) */ int nmaps; @@ -4424,7 +4427,6 @@ sm_gethostbyname(name, family) int flags = AI_DEFAULT|AI_ALL; int err; # endif /* NETINET6 */ - int save_errno; char *maptype[MAXMAPSTACK]; short mapreturn[MAXMAPACTIONS]; char hbuf[MAXNAME]; @@ -4437,7 +4439,7 @@ sm_gethostbyname(name, family) flags &= ~AI_ADDRCONFIG; # endif /* ADDRCONFIG_IS_BROKEN */ h = getipnodebyname(name, family, flags, &err); - h_errno = err; + SM_SET_H_ERRNO(err); # else /* NETINET6 */ h = gethostbyname(name); # endif /* NETINET6 */ @@ -4465,7 +4467,7 @@ sm_gethostbyname(name, family) return NULL; } (void) strlcpy(hbuf, name, sizeof hbuf); - shorten_hostname(hbuf); + (void) shorten_hostname(hbuf); /* if it hasn't been shortened, there's no point */ if (strcmp(hbuf, name) != 0) @@ -4478,7 +4480,7 @@ sm_gethostbyname(name, family) h = getipnodebyname(hbuf, family, AI_V4MAPPED|AI_ALL, &err); - h_errno = err; + SM_SET_H_ERRNO(err); save_errno = errno; # else /* NETINET6 */ h = gethostbyname(hbuf); @@ -4541,26 +4543,42 @@ sm_gethostbyaddr(addr, len, type) int type; { struct hostent *hp; + +#if NETINET6 + if (type == AF_INET6 && + IN6_IS_ADDR_UNSPECIFIED((struct in6_addr *) addr)) + { + /* Avoid reverse lookup for IPv6 unspecified address */ + SM_SET_H_ERRNO(HOST_NOT_FOUND); + return NULL; + } +#endif /* NETINET6 */ + #if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) # if SOLARIS == 20300 || SOLARIS == 203 - static struct hostent he; - static char buf[1000]; - extern struct hostent *_switch_gethostbyaddr_r(); + { + static struct hostent he; + static char buf[1000]; + extern struct hostent *_switch_gethostbyaddr_r(); - hp = _switch_gethostbyaddr_r(addr, len, type, &he, buf, sizeof(buf), &h_errno); + hp = _switch_gethostbyaddr_r(addr, len, type, &he, + buf, sizeof(buf), &h_errno); + } # else /* SOLARIS == 20300 || SOLARIS == 203 */ - extern struct hostent *__switch_gethostbyaddr(); + { + extern struct hostent *__switch_gethostbyaddr(); - hp = __switch_gethostbyaddr(addr, len, type); + hp = __switch_gethostbyaddr(addr, len, type); + } # endif /* SOLARIS == 20300 || SOLARIS == 203 */ #else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) */ # if NETINET6 - int err; -# endif /* NETINET6 */ + { + int err; -# if NETINET6 - hp = getipnodebyaddr(addr, len, type, &err); - h_errno = err; + hp = getipnodebyaddr(addr, len, type, &err); + SM_SET_H_ERRNO(err); + } # else /* NETINET6 */ hp = gethostbyaddr(addr, len, type); # endif /* NETINET6 */ @@ -4935,18 +4953,21 @@ load_if_names() switch (af) { case AF_INET6: - ia6 = sa->sin6.sin6_addr; -# ifdef __KAME__ - /* convert into proper scoped address - */ - if ((IN6_IS_ADDR_LINKLOCAL(&ia6) || - IN6_IS_ADDR_SITELOCAL(&ia6)) && +# ifdef __KAME__ + /* convert into proper scoped address */ + if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) || + IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) && sa->sin6.sin6_scope_id == 0) { - sa->sin6.sin6_scope_id = ntohs(ia6.s6_addr[3] | - ((unsigned int) ia6.s6_addr[2] << 8)); - ia6.s6_addr[2] = ia6.s6_addr[3] = 0; + struct in6_addr *ia6p; + + ia6p = &sa->sin6.sin6_addr; + sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] | + ((unsigned int)ia6p->s6_addr[2] << 8)); + ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0; } -# endif /* __KAME__ */ +# endif /* __KAME__ */ + ia6 = sa->sin6.sin6_addr; if (IN6_IS_ADDR_UNSPECIFIED(&ia6)) { addr = anynet_ntop(&ia6, buf6, sizeof buf6); @@ -5129,6 +5150,20 @@ load_if_names() # if NETINET6 case AF_INET6: +# ifdef __KAME__ + /* convert into proper scoped address */ + if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) || + IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) && + sa->sin6.sin6_scope_id == 0) + { + struct in6_addr *ia6p; + + ia6p = &sa->sin6.sin6_addr; + sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] | + ((unsigned int)ia6p->s6_addr[2] << 8)); + ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0; + } +# endif /* __KAME__ */ ia6 = sa->sin6.sin6_addr; if (IN6_IS_ADDR_UNSPECIFIED(&ia6)) { diff --git a/gnu/usr.sbin/sendmail/sendmail/conf.h b/gnu/usr.sbin/sendmail/sendmail/conf.h index 4e6184ff788..427df2c8843 100644 --- a/gnu/usr.sbin/sendmail/sendmail/conf.h +++ b/gnu/usr.sbin/sendmail/sendmail/conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -10,7 +10,7 @@ * the sendmail distribution. * * - * $Sendmail: conf.h,v 8.496.4.32 2000/12/15 19:20:53 gshapiro Exp $ + * $Sendmail: conf.h,v 8.496.4.37 2001/02/12 21:40:16 gshapiro Exp $ */ /* @@ -488,6 +488,9 @@ typedef int pid_t; # endif /* ! __svr4__ */ # define GIDSET_T gid_t # define USE_SA_SIGACTION 1 /* use sa_sigaction field */ +# if _FFR_MILTER +# define BROKEN_PTHREAD_SLEEP 1 /* sleep after pthread_create() fails */ +# endif /* _FFR_MILTER */ # ifndef _PATH_UNIX # define _PATH_UNIX "/dev/ksyms" # endif /* ! _PATH_UNIX */ @@ -998,14 +1001,18 @@ typedef int pid_t; # if defined(__OpenBSD__) # undef SPT_TYPE # define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */ -# define HASSETLOGIN 1 /* has setlogin(2) */ -# define HASSRANDOMDEV 1 /* has srandomdev(3) */ -# define HASURANDOMDEV 1 /* has /dev/urandom(4) */ -# define HASSETUSERCONTEXT 1 /* BSDI-style login classes */ +# define HASSETLOGIN 1 /* has setlogin(2) */ +# define HASURANDOMDEV 1 /* has /dev/urandom(4) */ # if OpenBSD < 199912 # define HASSTRL 0 /* strlcat(3) is broken in 2.5 and earlier */ # else /* OpenBSD < 199912 */ # define HASSTRL 1 /* has strlc{py,at}(3) functions */ +# if OpenBSD >= 200006 +# define HASSRANDOMDEV 1 /* has srandomdev(3) */ +# endif +# if OpenBSD >= 200012 +# define HASSETUSERCONTEXT 1 /* BSDI-style login classes */ +# endif # endif /* OpenBSD < 199912 */ # endif /* defined(__OpenBSD__) */ #endif /* defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) */ @@ -1729,6 +1736,9 @@ typedef int pid_t; # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif /* ! _PATH_SENDMAILPID */ # undef offsetof /* avoid stddefs.h, sys/sysmacros.h conflict */ +#if !defined(SM_SET_H_ERRNO) && defined(_REENTRANT) +# define SM_SET_H_ERRNO(err) set_h_errno((err)) +#endif /* ! SM_SET_H_ERRNO && _REENTRANT */ #endif /* __svr5__ */ /* ###################################################################### */ @@ -2724,6 +2734,10 @@ typedef void (*sigfunc_t) __P((int)); # define FORK fork /* function to call to fork mailer */ #endif /* ! FORK */ +/* setting h_errno */ +#ifndef SM_SET_H_ERRNO +# define SM_SET_H_ERRNO(err) h_errno = (err) +#endif /* SM_SET_H_ERRNO */ /* random routine -- set above using #ifdef _osname_ or in Makefile */ #if HASRANDOM @@ -2812,7 +2826,6 @@ typedef void (*sigfunc_t) __P((int)); # endif /* !HASSNPRINTF */ #endif /* SFIO */ - #ifndef SFIO_STDIO_COMPAT # define SFIO_STDIO_COMPAT 0 #endif /* ! SFIO_STDIO_COMPAT */ diff --git a/gnu/usr.sbin/sendmail/sendmail/control.c b/gnu/usr.sbin/sendmail/sendmail/control.c index f7839edd9e0..85cdf044584 100644 --- a/gnu/usr.sbin/sendmail/sendmail/control.c +++ b/gnu/usr.sbin/sendmail/sendmail/control.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -9,7 +9,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: control.c,v 8.44.14.13 2000/12/28 21:25:52 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: control.c,v 8.44.14.15 2001/01/22 19:00:22 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> diff --git a/gnu/usr.sbin/sendmail/sendmail/daemon.c b/gnu/usr.sbin/sendmail/sendmail/daemon.c index 1e35e7cbb76..a1f876b8fa0 100644 --- a/gnu/usr.sbin/sendmail/sendmail/daemon.c +++ b/gnu/usr.sbin/sendmail/sendmail/daemon.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -16,9 +16,9 @@ #ifndef lint # ifdef DAEMON -static char id[] = "@(#)$Sendmail: daemon.c,v 8.401.4.41 2000/12/28 23:46:43 gshapiro Exp $ (with daemon mode)"; +static char id[] = "@(#)$Sendmail: daemon.c,v 8.401.4.51 2001/02/23 18:57:27 geir Exp $ (with daemon mode)"; # else /* DAEMON */ -static char id[] = "@(#)$Sendmail: daemon.c,v 8.401.4.41 2000/12/28 23:46:43 gshapiro Exp $ (without daemon mode)"; +static char id[] = "@(#)$Sendmail: daemon.c,v 8.401.4.51 2001/02/23 18:57:27 geir Exp $ (without daemon mode)"; # endif /* DAEMON */ #endif /* ! lint */ @@ -463,9 +463,29 @@ getrequests(e) FD_ISSET(Daemons[idx].d_socket, &readfds)) { lotherend = Daemons[idx].d_socksize; + memset(&RealHostAddr, '\0', + sizeof RealHostAddr); t = accept(Daemons[idx].d_socket, (struct sockaddr *)&RealHostAddr, &lotherend); + + /* + ** If remote side closes before + ** accept() finishes, sockaddr + ** might not be fully filled in. + */ + + if (t >= 0 && + (lotherend == 0 || +# ifdef BSD4_4_SOCKADDR + RealHostAddr.sa.sa_len == 0 || +# endif /* BSD4_4_SOCKADDR */ + RealHostAddr.sa.sa_family != Daemons[idx].d_addr.sa.sa_family)) + { + (void) close(t); + t = -1; + errno = EINVAL; + } olddaemon = curdaemon = idx; break; } @@ -479,10 +499,30 @@ getrequests(e) struct sockaddr_un sa_un; lotherend = sizeof sa_un; + memset(&sa_un, '\0', sizeof sa_un); t = accept(ControlSocket, (struct sockaddr *)&sa_un, &lotherend); - control = TRUE; + + /* + ** If remote side closes before + ** accept() finishes, sockaddr + ** might not be fully filled in. + */ + + if (t >= 0 && + (lotherend == 0 || +# ifdef BSD4_4_SOCKADDR + sa_un.sun_len == 0 || +# endif /* BSD4_4_SOCKADDR */ + sa_un.sun_family != AF_UNIX)) + { + (void) close(t); + t = -1; + errno = EINVAL; + } + if (t >= 0) + control = TRUE; } # else /* NETUNIX */ if (curdaemon == -1) @@ -1624,7 +1664,8 @@ makeconnection(host, port, mci, e) /* Set up the address for outgoing connection. */ if (bitnset(D_BINDIF, d_flags) && - (p = macvalue(macid("{if_addr}", NULL), e)) != NULL) + (p = macvalue(macid("{if_addr}", NULL), e)) != NULL && + *p != '\0') { # if NETINET6 char p6[INET6_ADDRSTRLEN]; @@ -1638,18 +1679,13 @@ makeconnection(host, port, mci, e) { # if NETINET case AF_INET: - if ((clt_addr.sin.sin_addr.s_addr = inet_addr(p)) - != INADDR_NONE) + clt_addr.sin.sin_addr.s_addr = inet_addr(p); + if (clt_addr.sin.sin_addr.s_addr != INADDR_NONE && + clt_addr.sin.sin_addr.s_addr != INADDR_LOOPBACK) { clt_bind = TRUE; socksize = sizeof (struct sockaddr_in); } - else if (clt_addr.sin.sin_port != 0) - { - clt_addr.sin.sin_addr.s_addr = INADDR_ANY; - clt_bind = TRUE; - socksize = sizeof (struct sockaddr_in); - } break; # endif /* NETINET */ @@ -1660,15 +1696,9 @@ makeconnection(host, port, mci, e) else strlcpy(p6, p, sizeof p6); if (inet_pton(AF_INET6, p6, - &clt_addr.sin6.sin6_addr) == 1) - { - clt_bind = TRUE; - socksize = sizeof (struct sockaddr_in6); - } - else if (clt_addr.sin6.sin6_port != 0) + &clt_addr.sin6.sin6_addr) == 1 && + !IN6_IS_ADDR_LOOPBACK(&clt_addr.sin6.sin6_addr)) { - if (IN6_IS_ADDR_UNSPECIFIED(&clt_addr.sin6.sin6_addr)) - clt_addr.sin6.sin6_addr = in6addr_any; clt_bind = TRUE; socksize = sizeof (struct sockaddr_in6); } @@ -1731,7 +1761,7 @@ makeconnection(host, port, mci, e) */ # if NAMED_BIND - h_errno = 0; + SM_SET_H_ERRNO(0); # endif /* NAMED_BIND */ errno = 0; memset(&CurHostAddr, '\0', sizeof CurHostAddr); @@ -2406,10 +2436,8 @@ myhostname(hostbuf, size) { register struct hostent *hp; - if (gethostname(hostbuf, size) < 0) - { + if (gethostname(hostbuf, size) < 0 || hostbuf[0] == '\0') (void) strlcpy(hostbuf, "localhost", size); - } hp = sm_gethostbyname(hostbuf, InetMode); if (hp == NULL) return NULL; @@ -3055,7 +3083,7 @@ host_map_lookup(map, name, av, statp) : s->s_namecanon.nc_cname); errno = s->s_namecanon.nc_errno; # if NAMED_BIND - h_errno = s->s_namecanon.nc_herrno; + SM_SET_H_ERRNO(s->s_namecanon.nc_herrno); # endif /* NAMED_BIND */ *statp = s->s_namecanon.nc_stat; if (*statp == EX_TEMPFAIL) @@ -3231,6 +3259,8 @@ myhostname(hostbuf, size) fixcrlf(hostbuf, TRUE); (void) fclose(f); } + if (hostbuf[0] == '\0') + (void) strlcpy(hostbuf, "localhost", size); return NULL; } /* diff --git a/gnu/usr.sbin/sendmail/sendmail/deliver.c b/gnu/usr.sbin/sendmail/sendmail/deliver.c index 4d8c7c3b6e4..789c77cd983 100644 --- a/gnu/usr.sbin/sendmail/sendmail/deliver.c +++ b/gnu/usr.sbin/sendmail/sendmail/deliver.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: deliver.c,v 8.600.2.1.2.56 2000/12/19 01:16:12 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: deliver.c,v 8.600.2.1.2.66 2001/02/25 23:30:35 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -1132,7 +1132,7 @@ deliver(e, firstto) if (*mvp == NULL) { - /* running SMTP */ + /* running LMTP or SMTP */ #if SMTP clever = TRUE; *pvp = NULL; @@ -1142,6 +1142,14 @@ deliver(e, firstto) return EX_SOFTWARE; #endif /* SMTP */ } + else if (bitnset(M_LMTP, m->m_flags)) + { + /* not running LMTP */ + sm_syslog(LOG_ERR, NULL, + "Warning: mailer %s: LMTP flag (F=z) turned off", + m->m_name); + clrbitn(M_LMTP, m->m_flags); + } /* ** At this point *mvp points to the argument with $u. We @@ -1235,7 +1243,7 @@ deliver(e, firstto) continue; } #if NAMED_BIND - h_errno = 0; + SM_SET_H_ERRNO(0); #endif /* NAMED_BIND */ ovr = TRUE; @@ -1498,7 +1506,7 @@ deliver(e, firstto) } errno = 0; #if NAMED_BIND - h_errno = 0; + SM_SET_H_ERRNO(0); #endif /* NAMED_BIND */ CurHostName = NULL; @@ -2267,7 +2275,7 @@ reconnect: /* after switching to an authenticated connection */ !DONE_STARTTLS(mci->mci_flags)) { int olderrors; - bool hasdot; + int dotpos; bool usetls; bool saveQuickAbort = QuickAbort; bool saveSuprErrs = SuprErrs; @@ -2275,6 +2283,7 @@ reconnect: /* after switching to an authenticated connection */ # if _FFR_TLS_CLT1 char *p; # endif /* _FFR_TLS_CLT1 */ + char *srvname; extern SOCKADDR CurHostAddr; rcode = EX_OK; @@ -2296,11 +2305,25 @@ reconnect: /* after switching to an authenticated connection */ } # endif /* _FFR_TLS_CLT1 */ - hasdot = CurHostName[strlen(CurHostName) - 1] == '.'; - if (hasdot) - CurHostName[strlen(CurHostName) - 1] = '\0'; + if (mci->mci_host != NULL) + { + srvname = mci->mci_host; + dotpos = strlen(srvname) - 1; + if (dotpos >= 0) + { + if (srvname[dotpos] == '.') + srvname[dotpos] = '\0'; + else + dotpos = -1; + } + } + else + { + srvname = ""; + dotpos = -1; + } define(macid("{server_name}", NULL), - newstr(CurHostName), e); + newstr(srvname), e); if (CurHostAddr.sa.sa_family != 0) define(macid("{server_addr}", NULL), newstr(anynet_ntoa(&CurHostAddr)), e); @@ -2314,7 +2337,7 @@ reconnect: /* after switching to an authenticated connection */ olderrors = Errors; QuickAbort = FALSE; SuprErrs = TRUE; - if (rscheck("try_tls", CurHostName, NULL, + if (rscheck("try_tls", srvname, NULL, e, TRUE, FALSE, 8, host) != EX_OK || Errors > olderrors) usetls = FALSE; @@ -2323,9 +2346,9 @@ reconnect: /* after switching to an authenticated connection */ # endif /* _FFR_TLS_O_T */ } - /* undo change of CurHostName */ - if (hasdot) - CurHostName[strlen(CurHostName)] = '.'; + /* undo change of srvname */ + if (dotpos >= 0) + srvname[dotpos] = '.'; if (usetls) { if ((rcode = starttls(m, mci, e)) == EX_OK) @@ -2562,7 +2585,7 @@ do_transfer: rcode = mci->mci_exitstat; errno = mci->mci_errno; #if NAMED_BIND - h_errno = mci->mci_herrno; + SM_SET_H_ERRNO(mci->mci_herrno); #endif /* NAMED_BIND */ if (rcode == EX_OK) { @@ -2593,6 +2616,18 @@ do_transfer: /* get the exit status */ rcode = endmailer(mci, e, pv); + if (rcode == EX_TEMPFAIL && + SmtpError[0] == '\0') + { + /* + ** Need an e_message for mailq display. + ** We set SmtpError as + */ + + snprintf(SmtpError, sizeof SmtpError, + "%s mailer (%s) exited with EX_TEMPFAIL", + m->m_name, m->m_mailer); + } } else #if SMTP @@ -3345,7 +3380,7 @@ giveresponse(status, dsn, m, mci, ctladdr, xstart, e) } errno = 0; #if NAMED_BIND - h_errno = 0; + SM_SET_H_ERRNO(0); #endif /* NAMED_BIND */ } /* @@ -5228,6 +5263,8 @@ endtls(ssl, side) SSL *ssl; char *side; { + int ret = EX_OK; + if (ssl != NULL) { int r; @@ -5238,7 +5275,7 @@ endtls(ssl, side) sm_syslog(LOG_WARNING, NOQID, "SSL_shutdown %s failed: %d", side, r); - return EX_SOFTWARE; + ret = EX_SOFTWARE; } else if (r == 0) { @@ -5246,12 +5283,12 @@ endtls(ssl, side) sm_syslog(LOG_WARNING, NOQID, "SSL_shutdown %s not done", side); - return EX_SOFTWARE; + ret = EX_SOFTWARE; } SSL_free(ssl); ssl = NULL; } - return EX_OK; + return ret; } # endif /* STARTTLS */ #endif /* SMTP */ diff --git a/gnu/usr.sbin/sendmail/sendmail/domain.c b/gnu/usr.sbin/sendmail/sendmail/domain.c index f73d43d372d..ef9fea5ee00 100644 --- a/gnu/usr.sbin/sendmail/sendmail/domain.c +++ b/gnu/usr.sbin/sendmail/sendmail/domain.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1986, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -15,9 +15,9 @@ #ifndef lint # if NAMED_BIND -static char id[] = "@(#)$Sendmail: domain.c,v 8.114.6.1.2.6 2000/12/19 02:50:33 gshapiro Exp $ (with name server)"; +static char id[] = "@(#)$Sendmail: domain.c,v 8.114.6.1.2.8 2001/02/12 21:40:19 gshapiro Exp $ (with name server)"; # else /* NAMED_BIND */ -static char id[] = "@(#)$Sendmail: domain.c,v 8.114.6.1.2.6 2000/12/19 02:50:33 gshapiro Exp $ (without name server)"; +static char id[] = "@(#)$Sendmail: domain.c,v 8.114.6.1.2.8 2001/02/12 21:40:19 gshapiro Exp $ (without name server)"; # endif /* NAMED_BIND */ #endif /* ! lint */ @@ -356,7 +356,7 @@ punt: if (TryNullMXList) { - h_errno = 0; + SM_SET_H_ERRNO(0); errno = 0; h = sm_gethostbyname(host, AF_INET); if (h == NULL) @@ -370,7 +370,7 @@ punt: return -1; } # if NETINET6 - h_errno = 0; + SM_SET_H_ERRNO(0); errno = 0; h = sm_gethostbyname(host, AF_INET6); if (h == NULL && @@ -752,7 +752,7 @@ cnameloop: ** broken. */ - h_errno = TRY_AGAIN; + SM_SET_H_ERRNO(TRY_AGAIN); *statp = EX_TEMPFAIL; /* @@ -769,18 +769,22 @@ cnameloop: */ #if _FFR_WORKAROUND_BROKEN_NAMESERVERS - /* - ** Only return if not TRY_AGAIN as an - ** attempt with a different qtype may - ** succeed (res_querydomain() calls - ** res_query() calls res_send() which - ** sets errno to ETIMEDOUT if the - ** nameservers could be contacted but - ** didn't give an answer). - */ + if (WorkAroundBrokenAAAA) + { + /* + ** Only return if not TRY_AGAIN as an + ** attempt with a different qtype may + ** succeed (res_querydomain() calls + ** res_query() calls res_send() which + ** sets errno to ETIMEDOUT if the + ** nameservers could be contacted but + ** didn't give an answer). + */ - if (qtype != T_ANY && errno != ETIMEDOUT) - return FALSE; + if (qtype != T_ANY && + errno != ETIMEDOUT) + return FALSE; + } #else /* _FFR_WORKAROUND_BROKEN_NAMESERVERS */ if (qtype != T_ANY) return FALSE; @@ -931,7 +935,7 @@ cnameloop: host); CurEnv->e_message = newstr(ebuf); } - h_errno = NO_RECOVERY; + SM_SET_H_ERRNO(NO_RECOVERY); *statp = EX_CONFIG; return FALSE; } diff --git a/gnu/usr.sbin/sendmail/sendmail/headers.c b/gnu/usr.sbin/sendmail/sendmail/headers.c index 4740e58e30c..0745abb7340 100644 --- a/gnu/usr.sbin/sendmail/sendmail/headers.c +++ b/gnu/usr.sbin/sendmail/sendmail/headers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: headers.c,v 8.203.4.10 2000/10/13 17:54:30 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: headers.c,v 8.203.4.12 2001/01/22 19:00:22 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -308,7 +308,7 @@ hse: dp = qval; l = 0; dp[l++] = '"'; - for (sp = fvalue; *sp != '\0' && l < MAXNAME - 2; sp++) + for (sp = fvalue; *sp != '\0' && l < MAXNAME - 3; sp++) { switch(*sp) { @@ -337,7 +337,7 @@ hse: if (LogLevel > 9) sm_syslog(LOG_WARNING, e->e_id, "Warning: truncated header '%s' before check with '%s' len=%d max=%d", - fname, rs, l, MAXNAME); + fname, rs, l, MAXNAME - 1); } if ((sp = macvalue(macid("{currHeader}", NULL), e)) != NULL) diff --git a/gnu/usr.sbin/sendmail/sendmail/macro.c b/gnu/usr.sbin/sendmail/sendmail/macro.c index c5df9f62271..16709ccd2a1 100644 --- a/gnu/usr.sbin/sendmail/sendmail/macro.c +++ b/gnu/usr.sbin/sendmail/sendmail/macro.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: macro.c,v 8.40.16.7 2000/10/09 15:49:06 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: macro.c,v 8.40.16.9 2001/02/22 01:16:55 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -295,6 +295,8 @@ macvalue(n, e) if (p != NULL) return p; + if (e == e->e_parent) + break; e = e->e_parent; } return NULL; diff --git a/gnu/usr.sbin/sendmail/sendmail/main.c b/gnu/usr.sbin/sendmail/sendmail/main.c index 4fc32737936..18fe300494d 100644 --- a/gnu/usr.sbin/sendmail/sendmail/main.c +++ b/gnu/usr.sbin/sendmail/sendmail/main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,7 +13,7 @@ #ifndef lint static char copyright[] = -"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\ +"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\ All rights reserved.\n\ Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.\n\ Copyright (c) 1988, 1993\n\ @@ -21,7 +21,7 @@ static char copyright[] = #endif /* ! lint */ #ifndef lint -static char id[] = "@(#)$Sendmail: main.c,v 8.485.4.38 2000/12/19 02:50:33 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: main.c,v 8.485.4.44 2001/02/08 14:06:55 ca Exp $"; #endif /* ! lint */ #define _DEFINE @@ -1062,7 +1062,8 @@ main(argc, argv, envp) /* set up the $=m class now, after .cf has a chance to redefine $m */ expand("\201m", jbuf, sizeof jbuf, CurEnv); - setclass('m', jbuf); + if (jbuf[0] != '\0') + setclass('m', jbuf); /* probe interfaces and locate any additional names */ if (!DontProbeInterfaces) @@ -1231,8 +1232,10 @@ main(argc, argv, envp) /* full names can't have newlines */ if (strchr(FullName, '\n') != NULL) { - FullName = full = newstr(denlstring(FullName, TRUE, TRUE)); + full = newstr(denlstring(FullName, TRUE, TRUE)); + FullName = full; } + /* check for characters that may have to be quoted */ if (!rfc822_string(FullName)) { @@ -1241,6 +1244,7 @@ main(argc, argv, envp) ** as a comment so crackaddr() doesn't destroy ** the name portion of the address. */ + FullName = addquotes(FullName); if (full != NULL) free(full); @@ -1295,10 +1299,13 @@ main(argc, argv, envp) /* our name for SMTP codes */ expand("\201j", jbuf, sizeof jbuf, CurEnv); - MyHostName = jbuf; - if (strchr(jbuf, '.') == NULL) + if (jbuf[0] == '\0') + MyHostName = newstr("localhost"); + else + MyHostName = jbuf; + if (strchr(MyHostName, '.') == NULL) message("WARNING: local host name (%s) is not qualified; fix $j in config file", - jbuf); + MyHostName); /* make certain that this name is part of the $=w class */ setclass('w', MyHostName); @@ -1855,7 +1862,7 @@ main(argc, argv, envp) } else p = newstr(fv); - CurEnv->e_auth_param = newstr(xtextify(p, NULL)); + CurEnv->e_auth_param = newstr(xtextify(p, "=")); } } if (macvalue('s', CurEnv) == NULL) @@ -1866,6 +1873,7 @@ main(argc, argv, envp) CurEnv->e_to = NULL; CurEnv->e_flags |= EF_GLOBALERRS; HoldErrs = FALSE; + SuperSafe = FALSE; usrerr("Recipient names must be specified"); /* collect body for UUCP return */ diff --git a/gnu/usr.sbin/sendmail/sendmail/map.c b/gnu/usr.sbin/sendmail/sendmail/map.c index 77069af2a8c..cbc29ea6549 100644 --- a/gnu/usr.sbin/sendmail/sendmail/map.c +++ b/gnu/usr.sbin/sendmail/sendmail/map.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1992, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1992, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: map.c,v 8.414.4.34 2000/12/18 18:00:43 ca Exp $"; +static char id[] = "@(#)$Sendmail: map.c,v 8.414.4.39 2001/02/22 18:56:22 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -52,7 +52,7 @@ static bool db_map_open __P((MAP *, int, char *, DBTYPE, DB_INFO *)); static bool db_map_open __P((MAP *, int, char *, DBTYPE, void **)); # endif /* DB_VERSION_MAJOR > 2 */ #endif /* NEWDB */ -static bool extract_canonname __P((char *, char *, char[], int)); +static bool extract_canonname __P((char *, char *, char *, char[], int)); #ifdef LDAPMAP static void ldapmap_clear __P((LDAPMAP_STRUCT *)); static STAB *ldapmap_findconn __P((LDAPMAP_STRUCT *)); @@ -767,11 +767,10 @@ getcanonname(host, hbsize, trymx) #if NAMED_BIND if (got_tempfail) - h_errno = TRY_AGAIN; + SM_SET_H_ERRNO(TRY_AGAIN); else - h_errno = HOST_NOT_FOUND; + SM_SET_H_ERRNO(HOST_NOT_FOUND); #endif /* NAMED_BIND */ - return FALSE; } /* @@ -779,6 +778,7 @@ getcanonname(host, hbsize, trymx) ** ** Parameters: ** name -- the name against which to match. +** dot -- where to reinsert '.' to get FQDN ** line -- the /etc/hosts line. ** cbuf -- the location to store the result. ** cbuflen -- the size of cbuf. @@ -789,8 +789,9 @@ getcanonname(host, hbsize, trymx) */ static bool -extract_canonname(name, line, cbuf, cbuflen) +extract_canonname(name, dot, line, cbuf, cbuflen) char *name; + char *dot; char *line; char cbuf[]; int cbuflen; @@ -819,6 +820,14 @@ extract_canonname(name, line, cbuf, cbuflen) } if (strcasecmp(name, p) == 0) found = TRUE; + else if (dot != NULL) + { + /* try looking for the FQDN as well */ + *dot = '.'; + if (strcasecmp(name, p) == 0) + found = TRUE; + *dot = '\0'; + } } if (found && strchr(cbuf, '.') == NULL) { @@ -1623,6 +1632,10 @@ db_map_open(map, mode, mapclassname, dbtype, openinfo) ret = db->open(db, buf, NULL, dbtype, flags, DBMMODE); if (ret != 0) { +#ifdef DB_OLD_VERSION + if (ret == DB_OLD_VERSION) + ret = EINVAL; +#endif /* DB_OLD_VERSION */ (void) db->close(db, 0); db = NULL; } @@ -2258,7 +2271,7 @@ nis_getcanonname(name, hbsize, statp) *statp = EX_UNAVAILABLE; return FALSE; } - shorten_hostname(nbuf); + (void) shorten_hostname(nbuf); keylen = strlen(nbuf); if (yp_domain == NULL) @@ -2302,13 +2315,13 @@ nis_getcanonname(name, hbsize, statp) free(vp); if (tTd(38, 44)) dprintf("got record `%s'\n", host_record); - if (!extract_canonname(nbuf, host_record, cbuf, sizeof cbuf)) + if (!extract_canonname(nbuf, NULL, host_record, cbuf, sizeof cbuf)) { /* this should not happen, but.... */ *statp = EX_NOHOST; return FALSE; } - if (hbsize < strlen(cbuf)) + if (hbsize <= strlen(cbuf)) { *statp = EX_UNAVAILABLE; return FALSE; @@ -2639,7 +2652,7 @@ nisplus_getcanonname(name, hbsize, statp) return FALSE; } (void) strlcpy(nbuf, name, sizeof nbuf); - shorten_hostname(nbuf); + (void) shorten_hostname(nbuf); p = strchr(nbuf, '.'); if (p == NULL) @@ -3937,7 +3950,7 @@ ldapmap_parseargs(map, args) if ((ptr = strchr(p, ' ')) != NULL) *ptr = '\0'; - syserr("Deref must be [never|always|search|find] not %s in map %s", + syserr("Deref must be [never|always|search|find] (not %s) in map %s", p, map->map_mname); if (ptr != NULL) *ptr = ' '; @@ -3972,7 +3985,7 @@ ldapmap_parseargs(map, args) if ((ptr = strchr(p, ' ')) != NULL) *ptr = '\0'; - syserr("Scope must be [base|one|sub] not %s in map %s", + syserr("Scope must be [base|one|sub] (not %s) in map %s", p, map->map_mname); if (ptr != NULL) *ptr = ' '; @@ -4044,7 +4057,7 @@ ldapmap_parseargs(map, args) if ((ptr = strchr(p, ' ')) != NULL) *ptr = '\0'; - syserr("Method for binding must be [none|simple|krbv4] not %s in map %s", + syserr("Method for binding must be [none|simple|krbv4] (not %s) in map %s", p, map->map_mname); if (ptr != NULL) *ptr = ' '; @@ -4312,6 +4325,7 @@ void ldapmap_set_defaults(spec) char *spec; { + STAB *class; MAP map; /* Allocate and set the default values */ @@ -4320,7 +4334,17 @@ ldapmap_set_defaults(spec) ldapmap_clear(LDAPDefaults); memset(&map, '\0', sizeof map); + + /* look up the class */ + class = stab("ldap", ST_MAPCLASS, ST_FIND); + if (class == NULL) + { + syserr("readcf: LDAPDefaultSpec: class ldap not available"); + return; + } + map.map_class = &class->s_mapclass; map.map_db1 = (ARBPTR_T) LDAPDefaults; + map.map_mname = "O LDAPDefaultSpec"; (void) ldapmap_parseargs(&map, spec); @@ -5412,7 +5436,7 @@ ni_getcanonname(name, hbsize, statp) *statp = EX_UNAVAILABLE; return FALSE; } - shorten_hostname(nbuf); + (void) shorten_hostname(nbuf); /* we only accept single token search key */ if (strchr(nbuf, '.')) @@ -5832,6 +5856,7 @@ text_getcanonname(name, hbsize, statp) int *statp; { bool found; + char *dot; FILE *f; char linebuf[MAXLINE]; char cbuf[MAXNAME + 1]; @@ -5846,7 +5871,7 @@ text_getcanonname(name, hbsize, statp) return FALSE; } (void) strlcpy(nbuf, name, sizeof nbuf); - shorten_hostname(nbuf); + dot = shorten_hostname(nbuf); f = fopen(HostsFile, "r"); if (f == NULL) @@ -5862,7 +5887,8 @@ text_getcanonname(name, hbsize, statp) if (p != NULL) *p = '\0'; if (linebuf[0] != '\0') - found = extract_canonname(nbuf, linebuf, cbuf, sizeof cbuf); + found = extract_canonname(nbuf, dot, linebuf, + cbuf, sizeof cbuf); } (void) fclose(f); if (!found) diff --git a/gnu/usr.sbin/sendmail/sendmail/milter.c b/gnu/usr.sbin/sendmail/sendmail/milter.c index bfda5fec541..19a1854821e 100644 --- a/gnu/usr.sbin/sendmail/sendmail/milter.c +++ b/gnu/usr.sbin/sendmail/sendmail/milter.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -9,7 +9,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: milter.c,v 8.50.4.41 2000/12/27 21:35:32 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: milter.c,v 8.50.4.44 2001/01/23 19:43:57 gshapiro Exp $"; #endif /* ! lint */ #if _FFR_MILTER @@ -261,7 +261,7 @@ milter_sysread(m, buf, sz, to, e) } curl += len; - if (len == 0 || len >= sz) + if (len == 0 || curl >= sz) break; } @@ -1810,7 +1810,11 @@ milter_send_command(m, command, data, sz, e, state) case SMFIR_ACCEPT: /* this filter is done with message/connection */ - m->mf_state = SMFS_DONE; + if (command == SMFIC_HELO || + command == SMFIC_CONNECT) + m->mf_state = SMFS_CLOSABLE; + else + m->mf_state = SMFS_DONE; break; case SMFIR_CONTINUE: @@ -2092,7 +2096,7 @@ milter_per_connection_check(e) { struct milter *m = InputFilters[i]; - if (m->mf_state == SMFS_DONE) + if (m->mf_state == SMFS_CLOSABLE) milter_quit_filter(m, e); } } @@ -2936,11 +2940,31 @@ milter_helo(helo, e, state) ENVELOPE *e; char *state; { + int i; char *response; if (tTd(64, 10)) dprintf("milter_helo(%s)\n", helo); + /* HELO/EHLO can come after encryption is negotiated */ + for (i = 0; InputFilters[i] != NULL; i++) + { + struct milter *m = InputFilters[i]; + + switch (m->mf_state) + { + case SMFS_INMSG: + /* abort in message filters */ + milter_abort_filter(m, e); + /* FALLTHROUGH */ + + case SMFS_DONE: + /* reset done filters */ + m->mf_state = SMFS_OPEN; + break; + } + } + response = milter_command(SMFIC_HELO, helo, strlen(helo) + 1, MilterHeloMacros, e, state); milter_per_connection_check(e); diff --git a/gnu/usr.sbin/sendmail/sendmail/parseaddr.c b/gnu/usr.sbin/sendmail/sendmail/parseaddr.c index 0ba3ac307b4..a016fb40cee 100644 --- a/gnu/usr.sbin/sendmail/sendmail/parseaddr.c +++ b/gnu/usr.sbin/sendmail/sendmail/parseaddr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: parseaddr.c,v 8.234.4.9 2000/10/09 03:14:48 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: parseaddr.c,v 8.234.4.11 2001/02/14 04:07:27 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -2727,7 +2727,11 @@ rscheck(rwset, p1, p2, e, rmcomm, cnt, logl, host) MapOpenErr = FALSE; (void) rewrite(pvp, rsno, 0, e); if (MapOpenErr) - usrerrenh("4.3.0", "451 Temporary failure"); + { + usrerrenh("4.3.0", "451 Temporary failure"); + rstat = EX_TEMPFAIL; + goto finis; + } if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET || pvp[1] == NULL || (strcmp(pvp[1], "error") != 0 && diff --git a/gnu/usr.sbin/sendmail/sendmail/queue.c b/gnu/usr.sbin/sendmail/sendmail/queue.c index 86f669e545f..9f36ed49f33 100644 --- a/gnu/usr.sbin/sendmail/sendmail/queue.c +++ b/gnu/usr.sbin/sendmail/sendmail/queue.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -16,9 +16,9 @@ #ifndef lint # if QUEUE -static char id[] = "@(#)$Sendmail: queue.c,v 8.343.4.38 2000/12/08 14:33:02 ca Exp $ (with queueing)"; +static char id[] = "@(#)$Sendmail: queue.c,v 8.343.4.44 2001/02/22 00:55:35 ca Exp $ (with queueing)"; # else /* QUEUE */ -static char id[] = "@(#)$Sendmail: queue.c,v 8.343.4.38 2000/12/08 14:33:02 ca Exp $ (without queueing)"; +static char id[] = "@(#)$Sendmail: queue.c,v 8.343.4.44 2001/02/22 00:55:35 ca Exp $ (without queueing)"; # endif /* QUEUE */ #endif /* ! lint */ @@ -835,6 +835,7 @@ run_single_queue(queuedir, forkflag, verbose) CurEnv = &QueueEnvelope; e = newenvelope(&QueueEnvelope, CurEnv); e->e_flags = BlankEnvelope.e_flags; + e->e_parent = NULL; /* make sure we have disconnected from parent */ if (forkflag) @@ -1558,7 +1559,7 @@ workcmpf1(a, b) return b->w_lock - a->w_lock; /* job priority */ - return a->w_pri - b->w_pri; + return workcmpf0(a, b); } /* ** WORKCMPF2 -- second compare function for ordering work based on host name. @@ -1599,7 +1600,7 @@ workcmpf2(a, b) return i; /* job priority */ - return a->w_pri - b->w_pri; + return workcmpf0(a, b); } /* ** WORKCMPF3 -- simple submission-time-only compare function. diff --git a/gnu/usr.sbin/sendmail/sendmail/readcf.c b/gnu/usr.sbin/sendmail/sendmail/readcf.c index 8d9e6f2fc23..dc77ddef46e 100644 --- a/gnu/usr.sbin/sendmail/sendmail/readcf.c +++ b/gnu/usr.sbin/sendmail/sendmail/readcf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: readcf.c,v 8.382.4.31 2000/12/18 18:00:43 ca Exp $"; +static char id[] = "@(#)$Sendmail: readcf.c,v 8.382.4.38 2001/02/17 00:05:12 geir Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -844,6 +844,8 @@ fileclass(class, filename, fmt, safe, optional) ** T -- the mailer type (for DSNs) ** U -- the uid to run as ** W -- the time to wait at the end +** m -- maximum messages per connection +** / -- new root directory ** The first word is the canonical name of the mailer. ** ** Returns: @@ -2059,7 +2061,9 @@ setoption(opt, val, safe, sticky, e) if (val[0] == '\0') HelpFile = "helpfile"; else + { HelpFile = newstr(val); + } break; case 'h': /* maximum hop count */ @@ -2094,6 +2098,13 @@ setoption(opt, val, safe, sticky, e) HasWildcardMX = !clearmode; continue; } +#if _FFR_WORKAROUND_BROKEN_NAMESERVERS + if (sm_strcasecmp(q, "WorkAroundBrokenAAAA") == 0) + { + WorkAroundBrokenAAAA = !clearmode; + continue; + } +#endif /* _FFR_WORKAROUND_BROKEN_NAMESERVERS */ for (rfp = ResolverFlags; rfp->rf_name != NULL; rfp++) { if (strcasecmp(q, rfp->rf_name) == 0) @@ -2248,7 +2259,9 @@ setoption(opt, val, safe, sticky, e) if (val[0] == '\0') StatFile = "statistics"; else + { StatFile = newstr(val); + } break; case 's': /* be super safe, even if expensive */ @@ -2549,7 +2562,9 @@ setoption(opt, val, safe, sticky, e) case O_HSDIR: /* persistent host status directory */ if (val[0] != '\0') + { HostStatDir = newstr(val); + } break; case O_SINGTHREAD: /* single thread deliveries (requires hsdir) */ diff --git a/gnu/usr.sbin/sendmail/sendmail/recipient.c b/gnu/usr.sbin/sendmail/sendmail/recipient.c index c15cb82bdc3..037b95092bb 100644 --- a/gnu/usr.sbin/sendmail/sendmail/recipient.c +++ b/gnu/usr.sbin/sendmail/sendmail/recipient.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: recipient.c,v 8.231.14.8 2000/09/14 23:32:27 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: recipient.c,v 8.231.14.10 2001/02/14 04:07:30 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> diff --git a/gnu/usr.sbin/sendmail/sendmail/savemail.c b/gnu/usr.sbin/sendmail/sendmail/savemail.c index ce0fcd6fbac..54b6fb00ee8 100644 --- a/gnu/usr.sbin/sendmail/sendmail/savemail.c +++ b/gnu/usr.sbin/sendmail/sendmail/savemail.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: savemail.c,v 8.212.4.11 2000/12/18 18:00:44 ca Exp $"; +static char id[] = "@(#)$Sendmail: savemail.c,v 8.212.4.12 2001/01/07 19:31:05 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -1015,7 +1015,8 @@ errbody(mci, e, separator) } /* Reporting-MTA: is us (required) */ - (void) snprintf(buf, sizeof buf, "Reporting-MTA: dns; %.800s", MyHostName); + (void) snprintf(buf, sizeof buf, "Reporting-MTA: dns; %.800s", + MyHostName); putline(buf, mci); /* DSN-Gateway: not relevant since we are not translating */ diff --git a/gnu/usr.sbin/sendmail/sendmail/sendmail.h b/gnu/usr.sbin/sendmail/sendmail/sendmail.h index d25ed879f52..1fed27fa57d 100644 --- a/gnu/usr.sbin/sendmail/sendmail/sendmail.h +++ b/gnu/usr.sbin/sendmail/sendmail/sendmail.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -20,7 +20,7 @@ #ifdef _DEFINE # define EXTERN # ifndef lint -static char SmailId[] = "@(#)$Sendmail: sendmail.h,v 8.517.4.45 2000/12/28 23:46:44 gshapiro Exp $"; +static char SmailId[] = "@(#)$Sendmail: sendmail.h,v 8.517.4.50 2001/02/22 18:56:24 gshapiro Exp $"; # endif /* ! lint */ #else /* _DEFINE */ # define EXTERN extern @@ -152,6 +152,9 @@ static char SmailId[] = "@(#)$Sendmail: sendmail.h,v 8.517.4.45 2000/12/28 23:46 #ifndef INT32SZ # define INT32SZ 4 /* size of a 32 bit integer in bytes */ #endif /* ! INT32SZ */ +#ifndef INADDR_LOOPBACK +# define INADDR_LOOPBACK 0x7f000001 /* loopback address */ +#endif /* ! INADDR_LOOPBACK */ /* ** Error return from inet_addr(3), in case not defined in /usr/include. @@ -1377,6 +1380,7 @@ struct milter # define SMFS_OPEN 'O' /* connected to remote milter filter */ # define SMFS_INMSG 'M' /* currently servicing a message */ # define SMFS_DONE 'D' /* done with current message */ +# define SMFS_CLOSABLE 'Q' /* done with current connection */ # define SMFS_ERROR 'E' /* error state */ # define SMFS_READY 'R' /* ready for action */ @@ -1694,6 +1698,9 @@ EXTERN bool SingleThreadDelivery; /* single thread hosts on delivery */ EXTERN bool SuperSafe; /* be extra careful, even if expensive */ EXTERN bool SuprErrs; /* set if we are suppressing errors */ EXTERN bool TryNullMXList; /* if we are the best MX, try host directly */ +#if _FFR_WORKAROUND_BROKEN_NAMESERVERS +EXTERN bool WorkAroundBrokenAAAA; /* some nameservers return SERVFAIL on AAAA queries */ +#endif /* _FFR_WORKAROUND_BROKEN_NAMESERVERS */ EXTERN bool UseErrorsTo; /* use Errors-To: header (back compat) */ EXTERN bool UseHesiod; /* using Hesiod -- interpret Hesiod errors */ EXTERN bool UseNameServer; /* using DNS -- interpret h_errno & MX RRs */ @@ -2065,7 +2072,7 @@ extern void setuserenv __P((const char *, const char *)); extern void settime __P((ENVELOPE *)); extern char *sfgets __P((char *, int, FILE *, time_t, char *)); extern char *shortenstring __P((const char *, int)); -extern void shorten_hostname __P((char [])); +extern char *shorten_hostname __P((char [])); extern bool shorten_rfc822_string __P((char *, size_t)); extern SIGFUNC_DECL sigusr1 __P((int)); extern SIGFUNC_DECL sighup __P((int)); diff --git a/gnu/usr.sbin/sendmail/sendmail/srvrsmtp.c b/gnu/usr.sbin/sendmail/sendmail/srvrsmtp.c index ad9d3c572c0..828920741d4 100644 --- a/gnu/usr.sbin/sendmail/sendmail/srvrsmtp.c +++ b/gnu/usr.sbin/sendmail/sendmail/srvrsmtp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -16,9 +16,9 @@ #ifndef lint # if SMTP -static char id[] = "@(#)$Sendmail: srvrsmtp.c,v 8.471.2.2.2.66 2000/12/18 18:00:44 ca Exp $ (with SMTP)"; +static char id[] = "@(#)$Sendmail: srvrsmtp.c,v 8.471.2.2.2.67 2001/01/07 19:31:05 gshapiro Exp $ (with SMTP)"; # else /* SMTP */ -static char id[] = "@(#)$Sendmail: srvrsmtp.c,v 8.471.2.2.2.66 2000/12/18 18:00:44 ca Exp $ (without SMTP)"; +static char id[] = "@(#)$Sendmail: srvrsmtp.c,v 8.471.2.2.2.67 2001/01/07 19:31:05 gshapiro Exp $ (without SMTP)"; # endif /* SMTP */ #endif /* ! lint */ @@ -1159,7 +1159,7 @@ smtp(nullserver, d_flags, e) if (gothello) { usrerr("503 %s Duplicate HELO/EHLO", - MyHostName); + MyHostName); break; } diff --git a/gnu/usr.sbin/sendmail/sendmail/stats.c b/gnu/usr.sbin/sendmail/sendmail/stats.c index 2d25d90a145..98ea1814da9 100644 --- a/gnu/usr.sbin/sendmail/sendmail/stats.c +++ b/gnu/usr.sbin/sendmail/sendmail/stats.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: stats.c,v 8.36.14.3 2000/09/17 17:04:27 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: stats.c,v 8.36.14.5 2001/02/14 04:07:30 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> diff --git a/gnu/usr.sbin/sendmail/sendmail/udb.c b/gnu/usr.sbin/sendmail/sendmail/udb.c index 705f0f7e8c3..a649b2f8a11 100644 --- a/gnu/usr.sbin/sendmail/sendmail/udb.c +++ b/gnu/usr.sbin/sendmail/sendmail/udb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-1999, 2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -15,9 +15,9 @@ #ifndef lint # if USERDB -static char id[] = "@(#)$Sendmail: udb.c,v 8.111 1999/11/16 02:04:04 gshapiro Exp $ (with USERDB)"; +static char id[] = "@(#)$Sendmail: udb.c,v 8.111.16.1 2001/01/04 18:18:37 gshapiro Exp $ (with USERDB)"; # else /* USERDB */ -static char id[] = "@(#)$Sendmail: udb.c,v 8.111 1999/11/16 02:04:04 gshapiro Exp $ (without USERDB)"; +static char id[] = "@(#)$Sendmail: udb.c,v 8.111.16.1 2001/01/04 18:18:37 gshapiro Exp $ (without USERDB)"; # endif /* USERDB */ #endif /* ! lint */ @@ -1011,6 +1011,10 @@ _udbx_init(e) 0644); if (ret != 0) { +#ifdef DB_OLD_VERSION + if (ret == DB_OLD_VERSION) + ret = EINVAL; +#endif /* DB_OLD_VERSION */ (void) up->udb_dbp->close(up->udb_dbp, 0); up->udb_dbp = NULL; } diff --git a/gnu/usr.sbin/sendmail/sendmail/usersmtp.c b/gnu/usr.sbin/sendmail/sendmail/usersmtp.c index de53a801f47..f1a6b46beca 100644 --- a/gnu/usr.sbin/sendmail/sendmail/usersmtp.c +++ b/gnu/usr.sbin/sendmail/sendmail/usersmtp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -15,9 +15,9 @@ #ifndef lint # if SMTP -static char id[] = "@(#)$Sendmail: usersmtp.c,v 8.245.4.18 2000/12/20 16:36:11 ca Exp $ (with SMTP)"; +static char id[] = "@(#)$Sendmail: usersmtp.c,v 8.245.4.24 2001/02/21 00:59:09 gshapiro Exp $ (with SMTP)"; # else /* SMTP */ -static char id[] = "@(#)$Sendmail: usersmtp.c,v 8.245.4.18 2000/12/20 16:36:11 ca Exp $ (without SMTP)"; +static char id[] = "@(#)$Sendmail: usersmtp.c,v 8.245.4.24 2001/02/21 00:59:09 gshapiro Exp $ (without SMTP)"; # endif /* SMTP */ #endif /* ! lint */ @@ -844,6 +844,7 @@ safesaslfile(context, file) if (file == NULL || *file == '\0') return SASL_OK; + sff = SFF_SAFEDIRPATH|SFF_NOWLINK|SFF_NOGWFILES|SFF_NOWWFILES|SFF_ROOTOK; if ((p = strrchr(file, '/')) == NULL) p = file; @@ -873,12 +874,13 @@ safesaslfile(context, file) } # endif /* SASL <= 10515 */ - if ((r = safefile(file, RunAsUid, RunAsGid, RunAsUserName, sff, + p = file; + if ((r = safefile(p, RunAsUid, RunAsGid, RunAsUserName, sff, S_IRUSR, NULL)) == 0) return SASL_OK; if (LogLevel >= 11 || (r != ENOENT && LogLevel >= 9)) sm_syslog(LOG_WARNING, NOQID, "error: safesasl(%s) failed: %s", - file, errstring(r)); + p, errstring(r)); return SASL_CONTINUE; } @@ -1528,7 +1530,7 @@ smtpmailfrom(m, mci, e) else { smtpmessage("MAIL From:<@%s%c%s>%s", m, mci, MyHostName, - *bufp == '@' ? ',' : ':', bufp, optbuf); + *bufp == '@' ? ',' : ':', bufp, optbuf); } SmtpPhase = mci->mci_phase = "client MAIL"; sm_setproctitle(TRUE, e, "%s %s: %s", qid_printname(e), @@ -1943,6 +1945,8 @@ smtpdata(m, mci, e) else r = 4; e->e_statmsg = newstr(&SmtpReplyBuffer[r]); + SmtpPhase = mci->mci_phase = "idle"; + sm_setproctitle(TRUE, e, "%s: %s", CurHostName, mci->mci_phase); if (rstat != EX_PROTOCOL) return rstat; if (LogLevel > 1) @@ -2116,6 +2120,17 @@ smtpquit(m, mci, e) } /* ** SMTPRSET -- send a RSET (reset) command +** +** Parameters: +** m -- a pointer to the mailer. +** mci -- the mailer connection information. +** e -- the current envelope. +** +** Returns: +** none. +** +** Side Effects: +** closes the connection if there is no reply to RSET. */ void @@ -2154,6 +2169,15 @@ smtprset(m, mci, e) } /* ** SMTPPROBE -- check the connection state +** +** Parameters: +** mci -- the mailer connection information. +** +** Returns: +** none. +** +** Side Effects: +** closes the connection if there is no reply to RSET. */ int diff --git a/gnu/usr.sbin/sendmail/sendmail/util.c b/gnu/usr.sbin/sendmail/sendmail/util.c index dce23b9260c..2e236a93339 100644 --- a/gnu/usr.sbin/sendmail/sendmail/util.c +++ b/gnu/usr.sbin/sendmail/sendmail/util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: util.c,v 8.225.2.1.2.15 2000/10/18 23:46:07 ca Exp $"; +static char id[] = "@(#)$Sendmail: util.c,v 8.225.2.1.2.19 2001/02/22 18:56:24 gshapiro Exp $"; #endif /* ! lint */ #include <sendmail.h> @@ -497,7 +497,8 @@ log_sendmail_pid(e) pidf = safefopen(pidpath, O_WRONLY|O_TRUNC, 0644, sff); if (pidf == NULL) { - sm_syslog(LOG_ERR, NOQID, "unable to write %s", pidpath); + sm_syslog(LOG_ERR, NOQID, "unable to write %s: %s", + pidpath, errstring(errno)); } else { @@ -1785,10 +1786,10 @@ printit: ** host -- the host to shorten (stripped in place). ** ** Returns: -** none. +** place where string was trunacted, NULL if not truncated. */ -void +char * shorten_hostname(host) char host[]; { @@ -1808,7 +1809,7 @@ shorten_hostname(host) /* see if there is any domain at all -- if not, we are done */ p = strchr(host, '.'); if (p == NULL) - return; + return NULL; /* yes, we have a domain -- see if it looks like us */ mydom = macvalue('m', CurEnv); @@ -1817,7 +1818,11 @@ shorten_hostname(host) i = strlen(++p); if ((canon ? strcasecmp(p, mydom) : strncasecmp(p, mydom, i)) == 0 && (mydom[i] == '.' || mydom[i] == '\0')) + { *--p = '\0'; + return p; + } + return NULL; } /* ** PROG_OPEN -- open a program for reading diff --git a/gnu/usr.sbin/sendmail/sendmail/version.c b/gnu/usr.sbin/sendmail/sendmail/version.c index b191caabc05..5c9e87830fe 100644 --- a/gnu/usr.sbin/sendmail/sendmail/version.c +++ b/gnu/usr.sbin/sendmail/sendmail/version.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -12,7 +12,7 @@ */ #ifndef lint -static char id[] = "@(#)$Sendmail: version.c,v 8.43.4.25 2000/12/29 18:22:18 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: version.c,v 8.43.4.30 2001/02/27 19:22:31 gshapiro Exp $"; #endif /* ! lint */ -char Version[] = "8.11.2"; +char Version[] = "8.11.3"; diff --git a/gnu/usr.sbin/sendmail/smrsh/smrsh.c b/gnu/usr.sbin/sendmail/smrsh/smrsh.c index 1cc6f5bbadd..ae2c8f5d0ca 100644 --- a/gnu/usr.sbin/sendmail/smrsh/smrsh.c +++ b/gnu/usr.sbin/sendmail/smrsh/smrsh.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1993 Eric P. Allman. All rights reserved. * Copyright (c) 1993 @@ -13,7 +13,7 @@ #ifndef lint static char copyright[] = -"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\ +"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\ All rights reserved.\n\ Copyright (c) 1993 Eric P. Allman. All rights reserved.\n\ Copyright (c) 1993\n\ @@ -21,7 +21,7 @@ static char copyright[] = #endif /* ! lint */ #ifndef lint -static char id[] = "@(#)$Sendmail: smrsh.c,v 8.31.4.6 2000/10/09 20:37:16 gshapiro Exp $"; +static char id[] = "@(#)$Sendmail: smrsh.c,v 8.31.4.8 2001/01/22 19:00:26 gshapiro Exp $"; #endif /* ! lint */ /* @@ -76,9 +76,9 @@ static char id[] = "@(#)$Sendmail: smrsh.c,v 8.31.4.6 2000/10/09 20:37:16 gshapi #ifndef CMDDIR # if defined(HPUX10) || defined(HPUX11) || SOLARIS >= 20800 # define CMDDIR "/var/adm/sm.bin" -# else /* HPUX10 || HPUX11 || SOLARIS > 20800 */ +# else /* HPUX10 || HPUX11 || SOLARIS >= 20800 */ # define CMDDIR "/usr/adm/sm.bin" -# endif /* HPUX10 || HPUX11 || SOLARIS > 20800 */ +# endif /* HPUX10 || HPUX11 || SOLARIS >= 20800 */ #endif /* ! CMDDIR */ /* characters disallowed in the shell "-c" argument */ diff --git a/gnu/usr.sbin/sendmail/vacation/vacation.c b/gnu/usr.sbin/sendmail/vacation/vacation.c index cdd64fb50ca..7fa9145c72e 100644 --- a/gnu/usr.sbin/sendmail/vacation/vacation.c +++ b/gnu/usr.sbin/sendmail/vacation/vacation.c @@ -13,7 +13,7 @@ #ifndef lint static char copyright[] = -"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\ +"@(#) Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.\n\ All rights reserved.\n\ Copyright (c) 1983, 1987, 1993\n\ The Regents of the University of California. All rights reserved.\n\ @@ -21,7 +21,7 @@ static char copyright[] = #endif /* ! lint */ #ifndef lint -static char id[] = "@(#)$Sendmail: vacation.c,v 8.68.4.15 2000/11/27 22:17:27 ca Exp $"; +static char id[] = "@(#)$Sendmail: vacation.c,v 8.68.4.16 2001/02/14 05:02:21 gshapiro Exp $"; #endif /* ! lint */ #include <ctype.h> |