Import sendmail 8.12.11

This commit is contained in:
gshapiro 2004-02-14 21:53:31 +00:00
parent 96b960fca6
commit 238623a020
46 changed files with 699 additions and 244 deletions

View File

@ -88,6 +88,76 @@ y+PVZ1MwnEXfTQReVSla0AAOIRirHEh4YnUVZzFSNEJqoDRZQwVd7Q==
=shxn =shxn
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
Type Bits KeyID Created Expires Algorithm Use
pub 1024 0x95F61771 2003-12-10 ---------- RSA Sign & Encrypt
Key fingerprint = 46 FE 81 99 48 75 30 B1 3E A9 79 43 BB 78 C1 D4
uid Sendmail Signing Key/2004 <sendmail@Sendmail.ORG>
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.3 (OpenBSD)
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
=CNJY
-----END PGP PUBLIC KEY BLOCK-----
Type Bits KeyID Created Expires Algorithm Use Type Bits KeyID Created Expires Algorithm Use
pub 1024 0x396F0789 2003-01-15 ---------- RSA Sign & Encrypt pub 1024 0x396F0789 2003-01-15 ---------- RSA Sign & Encrypt
Key fingerprint = C4 73 DF 4A 97 9C 27 A9 EE 4F B2 BD 55 B5 E0 0F Key fingerprint = C4 73 DF 4A 97 9C 27 A9 EE 4F B2 BD 55 B5 E0 0F
@ -952,4 +1022,4 @@ SIXqPke2iCW6+zdG1T/gS5T9T9/Lf2c9FQf0FjURAi3ynDA2RBLA5FDsI8v3
=dbDm =dbDm
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
$Revision: 8.13.2.2 $, Last updated $Date: 2003/01/15 01:55:04 $ $Revision: 8.13.2.4 $, Last updated $Date: 2004/01/13 21:18:06 $

View File

@ -1,12 +1,74 @@
SENDMAIL RELEASE NOTES SENDMAIL RELEASE NOTES
$Id: RELEASE_NOTES,v 8.1340.2.165 2003/09/16 20:50:42 ca Exp $ $Id: RELEASE_NOTES,v 8.1340.2.189 2004/01/18 17:50:57 ca Exp $
This listing shows the version of the sendmail binary, the version This listing shows the version of the sendmail binary, the version
of the sendmail configuration files, the date of release, and a of the sendmail configuration files, the date of release, and a
summary of the changes in that release. summary of the changes in that release.
8.12.10/8.12.10 2003/09/24 8.12.11/8.12.11 2004/01/18
Use QueueFileMode when opening qf files. This error was a
regression in 8.12.10. Problem detected and diagnosed
Lech Szychowski of the Polish Power Grid Company.
Properly count the number of queue runners in a work group and
make sure the total limit of MaxQueueChildren is not
exceeded. Based on patch from Takayuki Yoshizawa of
Techfirm, Inc.
Take care of systems that can generate time values where the
seconds can exceed the usual range of 0 to 59.
Problem noted by Randy Diffenderfer of EDS.
Avoid regeneration of identical queue identifiers by processes
whose process id is the same as that of the initial
sendmail process that was used to start the daemon.
Problem noted by Randy Diffenderfer of EDS.
When a milter invokes smfi_delrcpt() compare the supplied
recipient address also against the printable addresses
of the current list to deal with rewritten addresses.
Based on patch from Sean Hanson of The Asylum.
BadRcptThrottle now also works for addresses which return the
error mailer, e.g., virtusertable entries with the
right hand side error:. Patch from Per Hedeland.
Fix printing of 8 bit characters as octals in log messages.
Based on patch by Andrey J. Melnikoff.
Undo change of algorithm for MIME 7-bit base64 encoding to 8-bit
text that has been introduced in 8.12.3. There are some
examples where the new code fails, but the old code works.
To get the 8.12.3-8.12.10 version, compile sendmail with
-DMIME7TO8_OLD=0. If you have an example of improper
7 to 8 bit conversion please send it to us.
Return normal error code for unknown SMTP commands instead of
the one specified by check_relay or a milter for a
connection. Problem noted by Andrzej Filip.
Some ident responses contain data after the terminating CRLF which
causes sendmail to log "POSSIBLE ATTACK...newline in string".
To avoid this everything after LF is ignored.
If the operating system supports O_EXLOCK and HASFLOCK is set
then a possible race condition for creating qf files
can be avoided. Note: the race condition does not
exist within sendmail, but between sendmail and an
external application that accesses qf files.
Log the proper options name for TLS related mising files for
the CACertPath, CACertFile, and DHParameters options.
Do not split an envelope if it will be discarded, otherwise df
files could be left behind. Problem found by Wolfgang
Breyha.
The use of the environment variables HOME and HOSTALIASES has been
deprecated and will be removed in version 8.13. This only
effects configuration which preserve those variable via the
'E' command in the cf file as sendmail clears out its entire
environment.
Portability:
Add support for Darwin 7.0/Mac OS X 10.3 (a.k.a. Panther).
Solaris 10 has unsetenv(), patch from Craig Mohrman of
Sun Microsystems.
LIBMILTER: Add extra checks in case a broken MTA sends bogus data
to libmilter. Based on code review by Rob Grzywinski.
SMRSH: Properly assemble commands that contain '&&' or '||'.
Problem noted by Eric Lee of Talking Heads.
New Files:
devtools/OS/Darwin.7.0
8.12.10/8.12.10 2003/09/24 (Released: 2003/09/17)
SECURITY: Fix a buffer overflow in address parsing. Problem SECURITY: Fix a buffer overflow in address parsing. Problem
detected by Michal Zalewski, patch from Todd C. Miller detected by Michal Zalewski, patch from Todd C. Miller
of Courtesan Consulting. of Courtesan Consulting.

View File

@ -2591,9 +2591,9 @@ my.domain and you have
my.domain RELAY my.domain RELAY
in the access map, then all e-mail with a sender address of in the access map, then any e-mail with a sender address of
<user@my.domain> gets through, even if check_relay would reject it <user@my.domain> will not be rejected by check_relay even though
(e.g., based on the hostname or IP address). This allows spammers it would match the hostname or IP address. This allows spammers
to get around DNS based blacklist by faking the sender address. To to get around DNS based blacklist by faking the sender address. To
avoid this problem you have to use tagged entries: avoid this problem you have to use tagged entries:
@ -3858,11 +3858,11 @@ confMAX_RCPTS_PER_MESSAGE MaxRecipientsPerMessage
receive a 452 error code (i.e., they receive a 452 error code (i.e., they
are deferred for the next delivery are deferred for the next delivery
attempt). attempt).
confBAD_RCPT_THROTTLE BadRcptThrottle [infinite] If set and more than the confBAD_RCPT_THROTTLE BadRcptThrottle [infinite] If set and the specified
specified number of recipients in an number of recipients in a single SMTP
envelope are rejected, sleep for one transaction have been rejected, sleep
second after each rejected RCPT for one second after each subsequent
command. RCPT command in that transaction.
confDONT_PROBE_INTERFACES DontProbeInterfaces confDONT_PROBE_INTERFACES DontProbeInterfaces
[False] If set, sendmail will _not_ [False] If set, sendmail will _not_
insert the names and addresses of any insert the names and addresses of any
@ -4375,4 +4375,4 @@ M4 DIVERSIONS
8 DNS based blacklists 8 DNS based blacklists
9 special local rulesets (1 and 2) 9 special local rulesets (1 and 2)
$Revision: 8.623.2.25 $, Last updated $Date: 2003/06/18 18:47:21 $ $Revision: 8.623.2.27 $, Last updated $Date: 2004/01/11 17:58:25 $

View File

@ -24,7 +24,7 @@
###################################################################### ######################################################################
###################################################################### ######################################################################
##### $Id: cfhead.m4,v 8.108.2.3 2003/04/03 17:51:51 ca Exp $ ##### ##### $Id: cfhead.m4,v 8.108.2.6 2003/12/05 02:26:47 ca Exp $ #####
##### $Id: cf.m4,v 8.32 1999/02/07 07:26:14 gshapiro Exp $ ##### ##### $Id: cf.m4,v 8.32 1999/02/07 07:26:14 gshapiro Exp $ #####
##### $Id: submit.mc,v 8.6.2.7 2003/09/10 22:11:56 ca Exp $ ##### ##### $Id: submit.mc,v 8.6.2.7 2003/09/10 22:11:56 ca Exp $ #####
##### $Id: msp.m4,v 1.32 2002/03/26 22:02:03 ca Exp $ ##### ##### $Id: msp.m4,v 1.32 2002/03/26 22:02:03 ca Exp $ #####
@ -32,7 +32,7 @@
##### $Id: no_default_msa.m4,v 8.2 2001/02/14 05:03:22 gshapiro Exp $ ##### ##### $Id: no_default_msa.m4,v 8.2 2001/02/14 05:03:22 gshapiro Exp $ #####
##### $Id: proto.m4,v 8.649.2.24 2003/08/04 21:14:26 ca Exp $ ##### ##### $Id: proto.m4,v 8.649.2.30 2004/01/11 17:54:06 ca Exp $ #####
# level 10 config file format # level 10 config file format
V10/Berkeley V10/Berkeley
@ -60,6 +60,7 @@ Cwlocalhost
# ... define this only if sendmail cannot automatically determine your domain # ... define this only if sendmail cannot automatically determine your domain
#Dj$w.Foo.COM #Dj$w.Foo.COM
# host/domain names ending with a token in class P are canonical
CP. CP.
# "Smart" relay host (may be null) # "Smart" relay host (may be null)
@ -110,7 +111,7 @@ D{MTAHost}[127.0.0.1]
# Configuration version number # Configuration version number
DZ8.12.10/Submit DZ8.12.11/Submit
############### ###############
@ -276,7 +277,7 @@ O QueueDirectory=/var/spool/clientmqueue
#O Timeout.quit=2m #O Timeout.quit=2m
#O Timeout.misc=2m #O Timeout.misc=2m
#O Timeout.command=1h #O Timeout.command=1h
#O Timeout.ident=5s O Timeout.ident=0
#O Timeout.fileopen=60s #O Timeout.fileopen=60s
#O Timeout.control=2m #O Timeout.control=2m
O Timeout.queuereturn=5d O Timeout.queuereturn=5d

View File

@ -305,4 +305,4 @@ define(`confMILTER_MACROS_ENVRCPT', ``{rcpt_mailer}, {rcpt_host}, {rcpt_addr}'')
divert(0)dnl divert(0)dnl
VERSIONID(`$Id: cfhead.m4,v 8.108.2.3 2003/04/03 17:51:51 ca Exp $') VERSIONID(`$Id: cfhead.m4,v 8.108.2.6 2003/12/05 02:26:47 ca Exp $')

View File

@ -1,6 +1,6 @@
divert(-1) divert(-1)
# #
# Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. # Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
# All rights reserved. # All rights reserved.
# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. # Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993 # Copyright (c) 1988, 1993
@ -13,7 +13,7 @@ divert(-1)
# #
divert(0) divert(0)
VERSIONID(`$Id: proto.m4,v 8.649.2.24 2003/08/04 21:14:26 ca Exp $') VERSIONID(`$Id: proto.m4,v 8.649.2.30 2004/01/11 17:54:06 ca Exp $')
# level CF_LEVEL config file format # level CF_LEVEL config file format
V`'CF_LEVEL/ifdef(`VENDOR_NAME', `VENDOR_NAME', `Berkeley') V`'CF_LEVEL/ifdef(`VENDOR_NAME', `VENDOR_NAME', `Berkeley')
@ -111,6 +111,7 @@ Fw`'confCW_FILE',
# ... `define' this only if sendmail cannot automatically determine your domain # ... `define' this only if sendmail cannot automatically determine your domain
ifdef(`confDOMAIN_NAME', `Dj`'confDOMAIN_NAME', `#Dj$w.Foo.COM') ifdef(`confDOMAIN_NAME', `Dj`'confDOMAIN_NAME', `#Dj$w.Foo.COM')
# host/domain names ending with a token in class P are canonical
CP. CP.
ifdef(`UUCP_RELAY', ifdef(`UUCP_RELAY',
@ -633,7 +634,8 @@ _OPTION(Milter.LogLevel, `confMILTER_LOG_LEVEL', `')
_OPTION(Milter.macros.connect, `confMILTER_MACROS_CONNECT', `') _OPTION(Milter.macros.connect, `confMILTER_MACROS_CONNECT', `')
_OPTION(Milter.macros.helo, `confMILTER_MACROS_HELO', `') _OPTION(Milter.macros.helo, `confMILTER_MACROS_HELO', `')
_OPTION(Milter.macros.envfrom, `confMILTER_MACROS_ENVFROM', `') _OPTION(Milter.macros.envfrom, `confMILTER_MACROS_ENVFROM', `')
_OPTION(Milter.macros.envrcpt, `confMILTER_MACROS_ENVRCPT', `')') _OPTION(Milter.macros.envrcpt, `confMILTER_MACROS_ENVRCPT', `')
')
# CA directory # CA directory
_OPTION(CACertPath, `confCACERT_PATH', `') _OPTION(CACertPath, `confCACERT_PATH', `')

View File

@ -1,6 +1,6 @@
divert(-1) divert(-1)
# #
# Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. # Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
# All rights reserved. # All rights reserved.
# Copyright (c) 1983 Eric P. Allman. All rights reserved. # Copyright (c) 1983 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993 # Copyright (c) 1988, 1993
@ -11,8 +11,8 @@ divert(-1)
# the sendmail distribution. # the sendmail distribution.
# #
# #
VERSIONID(`$Id: version.m4,v 8.92.2.22 2003/09/16 20:02:05 ca Exp $') VERSIONID(`$Id: version.m4,v 8.92.2.26 2004/01/13 00:29:26 ca Exp $')
# #
divert(0) divert(0)
# Configuration version number # Configuration version number
DZ8.12.10`'ifdef(`confCF_VERSION', `/confCF_VERSION') DZ8.12.11`'ifdef(`confCF_VERSION', `/confCF_VERSION')

View File

@ -9,7 +9,7 @@
.\" the sendmail distribution. .\" the sendmail distribution.
.\" .\"
.\" .\"
.\" $Id: op.me,v 8.609.2.26 2003/07/28 21:54:53 ca Exp $ .\" $Id: op.me,v 8.609.2.29 2004/01/11 17:58:24 ca Exp $
.\" .\"
.\" eqn op.me | pic | troff -me .\" eqn op.me | pic | troff -me
.\" .\"
@ -90,7 +90,7 @@ Sendmail, Inc.
.de Ve .de Ve
Version \\$2 Version \\$2
.. ..
.Ve $Revision: 8.609.2.26 $ .Ve $Revision: 8.609.2.29 $
.rm Ve .rm Ve
.sp .sp
For Sendmail Version 8.12 For Sendmail Version 8.12
@ -1125,7 +1125,7 @@ that some sites might want.
A complete description of the log levels A complete description of the log levels
is given in section is given in section
.\" XREF .\" XREF
4.6. 4.7.
.sh 2 "Dumping State" .sh 2 "Dumping State"
.pp .pp
You can ask You can ask
@ -3025,7 +3025,7 @@ alias files,
:include: files, :include: files,
and external databases) and external databases)
must be readable by that user. must be readable by that user.
Also, since sendmail will not be able to change it's uid, Also, since sendmail will not be able to change its uid,
delivery to programs or files will be marked as unsafe, delivery to programs or files will be marked as unsafe,
e.g., undeliverable, e.g., undeliverable,
in in
@ -6227,8 +6227,9 @@ selected SASL mechanisms.
Explanations of these properties can be found in the Cyrus SASL documentation. Explanations of these properties can be found in the Cyrus SASL documentation.
.ip BadRcptThrottle=\fIN\fP .ip BadRcptThrottle=\fIN\fP
[no short name] [no short name]
If set and more than the specified number of recipients in a single SMTP If set and the specified number of recipients in a single SMTP
envelope are rejected, sleep for one second after each rejected RCPT command. transaction have been rejected, sleep for one second after each subsequent
RCPT command in that transaction.
.ip BlankSub=\fIc\fP .ip BlankSub=\fIc\fP
[B] [B]
Set the blank substitution character to Set the blank substitution character to
@ -10767,7 +10768,7 @@ replace it with a blank sheet for double-sided output.
.\".sz 10 .\".sz 10
.\"Eric Allman .\"Eric Allman
.\".sp .\".sp
.\"Version $Revision: 8.609.2.26 $ .\"Version $Revision: 8.609.2.29 $
.\".ce 0 .\".ce 0
.bp 3 .bp 3
.ce .ce

View File

@ -7,7 +7,7 @@
* the sendmail distribution. * the sendmail distribution.
* *
* *
* $Id: mfapi.h,v 8.44.2.3 2002/12/19 02:10:09 ca Exp $ * $Id: mfapi.h,v 8.44.2.4 2003/10/20 21:51:49 msk Exp $
*/ */
/* /*
@ -108,7 +108,7 @@ struct smfiDesc
}; };
#if _FFR_SMFI_OPENSOCKET #if _FFR_SMFI_OPENSOCKET
LIBMILTER_API int smfi_opensocket __P((void)); LIBMILTER_API int smfi_opensocket __P((bool));
#endif /* _FFR_SMFI_OPENSOCKET */ #endif /* _FFR_SMFI_OPENSOCKET */
LIBMILTER_API int smfi_register __P((struct smfiDesc)); LIBMILTER_API int smfi_register __P((struct smfiDesc));
LIBMILTER_API int smfi_main __P((void)); LIBMILTER_API int smfi_main __P((void));

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 1999-2003 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* *
* By using this file, you agree to the terms and conditions set * By using this file, you agree to the terms and conditions set
@ -7,7 +7,7 @@
* the sendmail distribution. * the sendmail distribution.
* *
* *
* $Id: milter.h,v 8.37.2.1 2002/12/19 02:10:09 ca Exp $ * $Id: milter.h,v 8.37.2.3 2003/12/02 00:19:51 msk Exp $
*/ */
/* /*
@ -25,7 +25,11 @@
typedef pthread_t sthread_t; typedef pthread_t sthread_t;
typedef int socket_t; typedef int socket_t;
#if _FFR_MILTER_MACROS_EOM
# define MAX_MACROS_ENTRIES 5 /* max size of macro pointer array */
#else /* _FFR_MILTER_MACROS_EOM */
# define MAX_MACROS_ENTRIES 4 /* max size of macro pointer array */ # define MAX_MACROS_ENTRIES 4 /* max size of macro pointer array */
#endif /* _FFR_MILTER_MACROS_EOM */
/* /*
** context for milter ** context for milter

View File

@ -6,7 +6,7 @@
* forth in the LICENSE file which can be found at the top level of * forth in the LICENSE file which can be found at the top level of
* the sendmail distribution. * the sendmail distribution.
* *
* $Id: cdefs.h,v 1.15 2002/01/16 18:30:11 ca Exp $ * $Id: cdefs.h,v 1.15.2.1 2003/12/05 22:44:17 ca Exp $
*/ */
/* /*
@ -67,11 +67,14 @@
# if __GNUC__ >= 2 # if __GNUC__ >= 2
# if __GNUC__ == 2 && __GNUC_MINOR__ < 5 # if __GNUC__ == 2 && __GNUC_MINOR__ < 5
# define SM_DEAD(proto) volatile proto # define SM_DEAD(proto) volatile proto
# define SM_DEAD_D volatile
# else /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */ # else /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */
# define SM_DEAD(proto) proto __attribute__((__noreturn__)) # define SM_DEAD(proto) proto __attribute__((__noreturn__))
# define SM_DEAD_D
# endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */ # endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */
# else /* __GNUC__ >= 2 */ # else /* __GNUC__ >= 2 */
# define SM_DEAD(proto) proto # define SM_DEAD(proto) proto
# define SM_DEAD_D
# endif /* __GNUC__ >= 2 */ # endif /* __GNUC__ >= 2 */
# endif /* SM_DEAD */ # endif /* SM_DEAD */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. * Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993 * Copyright (c) 1988, 1993
@ -10,7 +10,7 @@
* the sendmail distribution. * the sendmail distribution.
* *
* *
* $Id: conf.h,v 1.90.2.18 2003/08/20 22:27:44 ca Exp $ * $Id: conf.h,v 1.90.2.20 2004/01/07 00:52:16 ca Exp $
*/ */
/* /*
@ -437,6 +437,9 @@ typedef int pid_t;
# if SOLARIS >= 20900 || (SOLARIS < 10000 && SOLARIS >= 209) # if SOLARIS >= 20900 || (SOLARIS < 10000 && SOLARIS >= 209)
# define HASURANDOMDEV 1 /* /dev/[u]random added in S9 */ # define HASURANDOMDEV 1 /* /dev/[u]random added in S9 */
# endif /* SOLARIS >= 20900 || (SOLARIS < 10000 && SOLARIS >= 209) */ # endif /* SOLARIS >= 20900 || (SOLARIS < 10000 && SOLARIS >= 209) */
# if SOLARIS >= 21000 || (SOLARIS < 10000 && SOLARIS >= 210)
# define HASUNSETENV 1 /* unsetenv() added in S10 */
# endif /* SOLARIS >= 21000 || (SOLARIS < 10000 && SOLARIS >= 210) */
# ifndef HASGETUSERSHELL # ifndef HASGETUSERSHELL
# define HASGETUSERSHELL 0 /* getusershell(3) causes core dumps pre-2.7 */ # define HASGETUSERSHELL 0 /* getusershell(3) causes core dumps pre-2.7 */
# endif /* ! HASGETUSERSHELL */ # endif /* ! HASGETUSERSHELL */
@ -2254,8 +2257,8 @@ typedef struct msgb mblk_t;
# undef HAVE_SYS_ERRLIST # undef HAVE_SYS_ERRLIST
# define sys_errlist __sys_errlist # define sys_errlist __sys_errlist
# define sys_nerr __sys_nerr # define sys_nerr __sys_nerr
# define major(dev) ((int)(((dev) >> 8) & 0xff) # define major(dev) ((int)(((dev) >> 8) & 0xff))
# define minor(dev) ((int)((dev) & 0xff) # define minor(dev) ((int)((dev) & 0xff))
# endif /* defined(__INTERIX) */ # endif /* defined(__INTERIX) */

View File

@ -48,7 +48,7 @@ Add a recipient for the current message.
<td>smfi_addrcpt will fail and return MI_FAILURE if: <td>smfi_addrcpt will fail and return MI_FAILURE if:
<ul><li>rcpt is NULL. <ul><li>rcpt is NULL.
<li>Adding headers in the current connection state is invalid. <li>Adding recipients in the current connection state is invalid.
<li>A network error occurs. <li>A network error occurs.
<li>SMFIF_ADDRCPT was not set when <a href="smfi_register.html">smfi_register</a> was called. <li>SMFIF_ADDRCPT was not set when <a href="smfi_register.html">smfi_register</a> was called.
</ul> </ul>

View File

@ -49,7 +49,7 @@ Remove a recipient from the current message's envelope.
<td>smfi_delrcpt will fail and return MI_FAILURE if: <td>smfi_delrcpt will fail and return MI_FAILURE if:
<ul> <ul>
<li>rcpt is NULL. <li>rcpt is NULL.
<li>Adding headers in the current connection state is invalid. <li>Deleting recipients in the current connection state is invalid.
<li>A network error occurs. <li>A network error occurs.
<li>SMFIF_DELRCPT was not set when <a href="smfi_register.html">smfi_register</a> was called. <li>SMFIF_DELRCPT was not set when <a href="smfi_register.html">smfi_register</a> was called.
</ul> </ul>

View File

@ -75,6 +75,12 @@ Otherwise, it return MI_SUCCESS.
<td> <td>
<ul> <ul>
<li>Values passed to smfi_setreply are not checked for standards compliance. <li>Values passed to smfi_setreply are not checked for standards compliance.
<li>The message parameter should contain only printable characters,
other characters may lead to undefined behavior.
For example, CR or LF will cause the call to fail,
single '%' characters will cause the text to be ignored
(if there really should be a '%' in the string,
use '%%' just like for <tt>printf(3)</tt>).
<li>For details about reply codes and their meanings, please see RFC's <li>For details about reply codes and their meanings, please see RFC's
<a href="http://www.rfc-editor.org/rfc/rfc821.txt">821</a>/ <a href="http://www.rfc-editor.org/rfc/rfc821.txt">821</a>/
<a href="http://www.rfc-editor.org/rfc/rfc2821.txt">2821</a> <a href="http://www.rfc-editor.org/rfc/rfc2821.txt">2821</a>

View File

@ -62,11 +62,29 @@ is passed to smfi_register().
<td><table border="1" cellspacing=0> <td><table border="1" cellspacing=0>
<tr bgcolor="#dddddd"><th>Return value</th><th>Description</th></tr> <tr bgcolor="#dddddd"><th>Return value</th><th>Description</th></tr>
<tr valign="top"> <tr valign="top">
<td>SMFIS_DISCARD</td> <td>SMFIS_ACCEPT</td>
<td>Not meaningful, as <td>Accept all commands and messages from this client without any
this is only meaningful from message-oriented routines. further contact with the filter. </td>
</td> </td>
</tr> </tr>
<tr valign="top">
<td>SMFIS_CONTINUE</td>
<td>Continue normal processing. </td>
</tr>
<tr valign="top">
<td>SMFIS_DISCARD</td>
<td>Undefined behaviour; do not use. </td>
</tr>
<tr valign="top">
<td>SMFIS_TEMPFAIL</td>
<td>Reject all commands and messages from this client with a
temporary failure reply code. </td>
</tr>
<tr valign="top">
<td>SMFIS_REJECT</td>
<td>Reject all commands and messages from this client with a
permanent failure reply code. </td>
</tr>
</table> </table>
</tr> </tr>
--> -->

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 1999-2003 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* *
* By using this file, you agree to the terms and conditions set * By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/ */
#include <sm/gen.h> #include <sm/gen.h>
SM_RCSID("@(#)$Id: engine.c,v 8.109.2.5 2003/08/04 18:14:33 ca Exp $") SM_RCSID("@(#)$Id: engine.c,v 8.109.2.8 2003/12/01 23:57:45 msk Exp $")
#include "libmilter.h" #include "libmilter.h"
@ -64,9 +64,16 @@ typedef struct cmdfct_t cmdfct;
#define CI_HELO 1 #define CI_HELO 1
#define CI_MAIL 2 #define CI_MAIL 2
#define CI_RCPT 3 #define CI_RCPT 3
#if _FFR_MILTER_MACROS_EOM
# define CI_EOM 4
# if CI_EOM >= MAX_MACROS_ENTRIES
ERROR: do not compile with CI_EOM >= MAX_MACROS_ENTRIES
# endif
#else /* _FFR_MILTER_MACROS_EOM */
# if CI_RCPT >= MAX_MACROS_ENTRIES # if CI_RCPT >= MAX_MACROS_ENTRIES
ERROR: do not compile with CI_RCPT >= MAX_MACROS_ENTRIES ERROR: do not compile with CI_RCPT >= MAX_MACROS_ENTRIES
# endif # endif
#endif /* _FFR_MILTER_MACROS_EOM */
/* function prototypes */ /* function prototypes */
static int st_abortfct __P((genarg *)); static int st_abortfct __P((genarg *));
@ -156,7 +163,11 @@ static cmdfct cmds[] =
{SMFIC_MACRO, CM_ARGV, ST_NONE, CT_KEEP, CI_NONE, st_macros }, {SMFIC_MACRO, CM_ARGV, ST_NONE, CT_KEEP, CI_NONE, st_macros },
{SMFIC_BODY, CM_ARG1, ST_BODY, CT_CONT, CI_NONE, st_bodychunk }, {SMFIC_BODY, CM_ARG1, ST_BODY, CT_CONT, CI_NONE, st_bodychunk },
{SMFIC_CONNECT, CM_ARG2, ST_CONN, CT_CONT, CI_CONN, st_connectinfo }, {SMFIC_CONNECT, CM_ARG2, ST_CONN, CT_CONT, CI_CONN, st_connectinfo },
#if _FFR_MILTER_MACROS_EOM
{SMFIC_BODYEOB, CM_ARG1, ST_ENDM, CT_CONT, CI_EOM, st_bodyend },
#else /* _FFR_MILTER_MACROS_EOM */
{SMFIC_BODYEOB, CM_ARG1, ST_ENDM, CT_CONT, CI_NONE, st_bodyend }, {SMFIC_BODYEOB, CM_ARG1, ST_ENDM, CT_CONT, CI_NONE, st_bodyend },
#endif /* _FFR_MILTER_MACROS_EOM */
{SMFIC_HELO, CM_ARG1, ST_HELO, CT_CONT, CI_HELO, st_helo }, {SMFIC_HELO, CM_ARG1, ST_HELO, CT_CONT, CI_HELO, st_helo },
{SMFIC_HEADER, CM_ARG2, ST_HDRS, CT_CONT, CI_NONE, st_header }, {SMFIC_HEADER, CM_ARG2, ST_HDRS, CT_CONT, CI_NONE, st_header },
{SMFIC_MAIL, CM_ARGV, ST_MAIL, CT_CONT, CI_MAIL, st_sender }, {SMFIC_MAIL, CM_ARGV, ST_MAIL, CT_CONT, CI_MAIL, st_sender },
@ -599,7 +610,7 @@ st_connectinfo(g)
l = g->a_len; l = g->a_len;
while (s[i] != '\0' && i <= l) while (s[i] != '\0' && i <= l)
++i; ++i;
if (i >= l) if (i + 1 >= l)
return _SMFIS_ABORT; return _SMFIS_ABORT;
/* Move past trailing \0 in host string */ /* Move past trailing \0 in host string */
@ -608,9 +619,7 @@ st_connectinfo(g)
(void) memset(&sockaddr, '\0', sizeof sockaddr); (void) memset(&sockaddr, '\0', sizeof sockaddr);
if (family != SMFIA_UNKNOWN) if (family != SMFIA_UNKNOWN)
{ {
(void) memcpy((void *) &port, (void *) (s + i), if (i + sizeof port >= l)
sizeof port);
if ((i += sizeof port) >= l)
{ {
smi_log(SMI_LOG_ERR, smi_log(SMI_LOG_ERR,
"%s: connect[%d]: wrong len %d >= %d", "%s: connect[%d]: wrong len %d >= %d",
@ -618,6 +627,9 @@ st_connectinfo(g)
(int) g->a_ctx->ctx_id, (int) i, (int) l); (int) g->a_ctx->ctx_id, (int) i, (int) l);
return _SMFIS_ABORT; return _SMFIS_ABORT;
} }
(void) memcpy((void *) &port, (void *) (s + i),
sizeof port);
i += sizeof port;
/* make sure string is terminated */ /* make sure string is terminated */
if (s[l - 1] != '\0') if (s[l - 1] != '\0')
@ -729,7 +741,12 @@ st_helo(g)
mi_clr_macros(g->a_ctx, g->a_idx + 1); mi_clr_macros(g->a_ctx, g->a_idx + 1);
if (g->a_ctx->ctx_smfi != NULL && if (g->a_ctx->ctx_smfi != NULL &&
(fi_helo = g->a_ctx->ctx_smfi->xxfi_helo) != NULL) (fi_helo = g->a_ctx->ctx_smfi->xxfi_helo) != NULL)
{
/* paranoia: check for terminating '\0' */
if (g->a_len == 0 || g->a_buf[g->a_len - 1] != '\0')
return MI_FAILURE;
return (*fi_helo)(g->a_ctx, g->a_buf); return (*fi_helo)(g->a_ctx, g->a_buf);
}
return SMFIS_CONTINUE; return SMFIS_CONTINUE;
} }
/* /*
@ -847,6 +864,11 @@ st_macros(g)
case SMFIC_RCPT: case SMFIC_RCPT:
i = CI_RCPT; i = CI_RCPT;
break; break;
#if _FFR_MILTER_MACROS_EOM
case SMFIC_BODYEOB:
i = CI_EOM;
break;
#endif /* _FFR_MILTER_MACROS_EOM */
default: default:
free(argv); free(argv);
return _SMFIS_FAIL; return _SMFIS_FAIL;
@ -1089,10 +1111,16 @@ dec_argv(buf, len)
for (i = 0, elem = 0; i < len && elem < nelem; i++) for (i = 0, elem = 0; i < len && elem < nelem; i++)
{ {
if (buf[i] == '\0') if (buf[i] == '\0')
s[++elem] = &(buf[i + 1]); {
++elem;
if (i + 1 >= len)
s[elem] = NULL;
else
s[elem] = &(buf[i + 1]);
}
} }
/* overwrite last entry */ /* overwrite last entry (already done above, just paranoia) */
s[elem] = NULL; s[elem] = NULL;
return s; return s;
} }
@ -1117,6 +1145,9 @@ dec_arg2(buf, len, s1, s2)
{ {
size_t i; size_t i;
/* paranoia: check for terminating '\0' */
if (len == 0 || buf[len - 1] != '\0')
return MI_FAILURE;
*s1 = buf; *s1 = buf;
for (i = 1; i < len && buf[i] != '\0'; i++) for (i = 1; i < len && buf[i] != '\0'; i++)
continue; continue;

View File

@ -19,7 +19,7 @@
#ifdef _DEFINE #ifdef _DEFINE
# define EXTERN # define EXTERN
# define INIT(x) = x # define INIT(x) = x
SM_IDSTR(MilterlId, "@(#)$Id: libmilter.h,v 8.33.2.12 2003/09/08 21:39:55 yuri Exp $") SM_IDSTR(MilterlId, "@(#)$Id: libmilter.h,v 8.33.2.13 2003/10/20 21:51:50 msk Exp $")
#else /* _DEFINE */ #else /* _DEFINE */
# define EXTERN extern # define EXTERN extern
# define INIT(x) # define INIT(x)
@ -176,7 +176,7 @@ extern void mi_clean_signals __P((void));
extern struct hostent *mi_gethostbyname __P((char *, int)); extern struct hostent *mi_gethostbyname __P((char *, int));
extern int mi_inet_pton __P((int, const char *, void *)); extern int mi_inet_pton __P((int, const char *, void *));
extern void mi_closener __P((void)); extern void mi_closener __P((void));
extern int mi_opensocket __P((char *, int, int, smfiDesc_ptr)); extern int mi_opensocket __P((char *, int, int, bool, smfiDesc_ptr));
/* communication functions */ /* communication functions */
extern char *mi_rd_cmd __P((socket_t, struct timeval *, char *, size_t *, char *)); extern char *mi_rd_cmd __P((socket_t, struct timeval *, char *, size_t *, char *));

View File

@ -9,7 +9,7 @@
*/ */
#include <sm/gen.h> #include <sm/gen.h>
SM_RCSID("@(#)$Id: listener.c,v 8.85.2.12 2003/08/04 18:47:29 ca Exp $") SM_RCSID("@(#)$Id: listener.c,v 8.85.2.17 2003/10/21 17:22:57 ca Exp $")
/* /*
** listener.c -- threaded network listener ** listener.c -- threaded network listener
@ -18,6 +18,9 @@ SM_RCSID("@(#)$Id: listener.c,v 8.85.2.12 2003/08/04 18:47:29 ca Exp $")
#include "libmilter.h" #include "libmilter.h"
#include <sm/errstring.h> #include <sm/errstring.h>
#include <sys/types.h>
#include <sys/stat.h>
# if NETINET || NETINET6 # if NETINET || NETINET6
# include <arpa/inet.h> # include <arpa/inet.h>
@ -28,7 +31,7 @@ static int L_family;
static SOCKADDR_LEN_T L_socksize; static SOCKADDR_LEN_T L_socksize;
static socket_t listenfd = INVALID_SOCKET; static socket_t listenfd = INVALID_SOCKET;
static socket_t mi_milteropen __P((char *, int, char *)); static socket_t mi_milteropen __P((char *, int, bool, char *));
/* /*
** MI_OPENSOCKET -- create the socket where this filter and the MTA will meet ** MI_OPENSOCKET -- create the socket where this filter and the MTA will meet
@ -37,6 +40,8 @@ static socket_t mi_milteropen __P((char *, int, char *));
** conn -- connection description ** conn -- connection description
** backlog -- listen backlog ** backlog -- listen backlog
** dbg -- debug level ** dbg -- debug level
** rmsocket -- if true, try to unlink() the socket first
** (UNIX domain sockets only)
** smfi -- filter structure to use ** smfi -- filter structure to use
** **
** Return value: ** Return value:
@ -44,10 +49,11 @@ static socket_t mi_milteropen __P((char *, int, char *));
*/ */
int int
mi_opensocket(conn, backlog, dbg, smfi) mi_opensocket(conn, backlog, dbg, rmsocket, smfi)
char *conn; char *conn;
int backlog; int backlog;
int dbg; int dbg;
bool rmsocket;
smfiDesc_ptr smfi; smfiDesc_ptr smfi;
{ {
if (smfi == NULL || conn == NULL) if (smfi == NULL || conn == NULL)
@ -64,7 +70,7 @@ mi_opensocket(conn, backlog, dbg, smfi)
} }
(void) smutex_init(&L_Mutex); (void) smutex_init(&L_Mutex);
(void) smutex_lock(&L_Mutex); (void) smutex_lock(&L_Mutex);
listenfd = mi_milteropen(conn, backlog, smfi->xxfi_name); listenfd = mi_milteropen(conn, backlog, rmsocket, smfi->xxfi_name);
if (!ValidSocket(listenfd)) if (!ValidSocket(listenfd))
{ {
smi_log(SMI_LOG_FATAL, smi_log(SMI_LOG_FATAL,
@ -91,6 +97,8 @@ mi_opensocket(conn, backlog, dbg, smfi)
** Parameters: ** Parameters:
** conn -- connection description ** conn -- connection description
** backlog -- listen backlog ** backlog -- listen backlog
** rmsocket -- if true, try to unlink() the socket first
** (UNIX domain sockets only)
** name -- name for logging ** name -- name for logging
** **
** Returns: ** Returns:
@ -105,9 +113,10 @@ static char *sockpath = NULL;
#endif /* NETUNIX */ #endif /* NETUNIX */
static socket_t static socket_t
mi_milteropen(conn, backlog, name) mi_milteropen(conn, backlog, rmsocket, name)
char *conn; char *conn;
int backlog; int backlog;
bool rmsocket;
char *name; char *name;
{ {
socket_t sock; socket_t sock;
@ -457,6 +466,41 @@ mi_milteropen(conn, backlog, name)
return INVALID_SOCKET; return INVALID_SOCKET;
} }
#if NETUNIX
if (addr.sa.sa_family == AF_UNIX && rmsocket)
{
struct stat s;
if (stat(colon, &s) != 0)
{
if (errno != ENOENT)
{
smi_log(SMI_LOG_ERR,
"%s: Unable to stat() %s: %s",
name, colon, sm_errstring(errno));
(void) closesocket(sock);
return INVALID_SOCKET;
}
}
else if (!S_ISSOCK(s.st_mode))
{
smi_log(SMI_LOG_ERR,
"%s: %s is not a UNIX domain socket",
name, colon);
(void) closesocket(sock);
return INVALID_SOCKET;
}
else if (unlink(colon) != 0)
{
smi_log(SMI_LOG_ERR,
"%s: Unable to remove %s: %s",
name, colon, sm_errstring(errno));
(void) closesocket(sock);
return INVALID_SOCKET;
}
}
#endif /* NETUNIX */
if (bind(sock, &addr.sa, L_socksize) < 0) if (bind(sock, &addr.sa, L_socksize) < 0)
{ {
smi_log(SMI_LOG_ERR, smi_log(SMI_LOG_ERR,
@ -591,6 +635,8 @@ mi_closener()
** Parameters: ** Parameters:
** conn -- connection description ** conn -- connection description
** dbg -- debug level ** dbg -- debug level
** rmsocket -- if true, try to unlink() the socket first
** (UNIX domain sockets only)
** smfi -- filter structure to use ** smfi -- filter structure to use
** timeout -- timeout for reads/writes ** timeout -- timeout for reads/writes
** backlog -- listen queue backlog size ** backlog -- listen queue backlog size
@ -673,7 +719,7 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
FD_RD_VAR(rds, excs); FD_RD_VAR(rds, excs);
struct timeval chktime; struct timeval chktime;
if (mi_opensocket(conn, backlog, dbg, smfi) == MI_FAILURE) if (mi_opensocket(conn, backlog, dbg, false, smfi) == MI_FAILURE)
return MI_FAILURE; return MI_FAILURE;
clilen = L_socksize; clilen = L_socksize;

View File

@ -9,7 +9,7 @@
*/ */
#include <sm/gen.h> #include <sm/gen.h>
SM_RCSID("@(#)$Id: main.c,v 8.64.2.10 2003/01/23 22:34:24 ca Exp $") SM_RCSID("@(#)$Id: main.c,v 8.64.2.13 2003/10/20 22:27:13 ca Exp $")
#define _DEFINE 1 #define _DEFINE 1
#include "libmilter.h" #include "libmilter.h"
@ -86,7 +86,7 @@ smfi_stop()
} }
/* /*
** default values for some variables. ** Default values for some variables.
** Most of these can be changed with the functions below. ** Most of these can be changed with the functions below.
*/ */
@ -101,19 +101,22 @@ static int backlog = MI_SOMAXCONN;
** able to start up ** able to start up
** **
** Parameters: ** Parameters:
** None. ** rmsocket -- if true, instructs libmilter to attempt
** to remove the socket before creating it;
** only applies for "local:" or "unix:" sockets
** **
** Return: ** Return:
** MI_SUCCESS/MI_FAILURE ** MI_SUCCESS/MI_FAILURE
*/ */
int int
smfi_opensocket() smfi_opensocket(rmsocket)
bool rmsocket;
{ {
if (smfi == NULL || conn == NULL) if (smfi == NULL || conn == NULL)
return MI_FAILURE; return MI_FAILURE;
return mi_opensocket(conn, backlog, dbg, smfi); return mi_opensocket(conn, backlog, dbg, rmsocket, smfi);
} }
#endif /* _FFR_SMFI_OPENSOCKET */ #endif /* _FFR_SMFI_OPENSOCKET */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 1999-2003 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* *
* By using this file, you agree to the terms and conditions set * By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/ */
#include <sm/gen.h> #include <sm/gen.h>
SM_RCSID("@(#)$Id: signal.c,v 8.37.2.3 2003/08/04 18:14:33 ca Exp $") SM_RCSID("@(#)$Id: signal.c,v 8.37.2.4 2003/11/19 00:22:40 ca Exp $")
#include "libmilter.h" #include "libmilter.h"

View File

@ -9,7 +9,7 @@
*/ */
#include <sm/gen.h> #include <sm/gen.h>
SM_RCSID("@(#)$Id: assert.c,v 1.25 2001/09/11 04:04:47 gshapiro Exp $") SM_RCSID("@(#)$Id: assert.c,v 1.25.2.1 2003/12/05 22:44:17 ca Exp $")
/* /*
** Abnormal program termination and assertion checking. ** Abnormal program termination and assertion checking.
@ -127,7 +127,7 @@ sm_abort_sethandler(f)
** doesn't. ** doesn't.
*/ */
void void SM_DEAD_D
#if SM_VA_STD #if SM_VA_STD
sm_abort(char *fmt, ...) sm_abort(char *fmt, ...)
#else /* SM_VA_STD */ #else /* SM_VA_STD */
@ -163,7 +163,7 @@ sm_abort(fmt, va_alist)
** doesn't. ** doesn't.
*/ */
void void SM_DEAD_D
sm_abort_at(filename, lineno, msg) sm_abort_at(filename, lineno, msg)
const char *filename; const char *filename;
int lineno; int lineno;

View File

@ -9,7 +9,7 @@
*/ */
#include <sm/gen.h> #include <sm/gen.h>
SM_RCSID("@(#)$Id: exc.c,v 1.47 2002/01/09 18:51:43 ca Exp $") SM_RCSID("@(#)$Id: exc.c,v 1.47.2.1 2003/12/05 22:44:17 ca Exp $")
/* /*
** exception handling ** exception handling
@ -587,7 +587,7 @@ sm_exc_newthread(h)
** doesn't. ** doesn't.
*/ */
void void SM_DEAD_D
sm_exc_raise_x(exc) sm_exc_raise_x(exc)
SM_EXC_T *exc; SM_EXC_T *exc;
{ {
@ -648,7 +648,7 @@ sm_exc_raise_x(exc)
** none. ** none.
*/ */
void void SM_DEAD_D
#if SM_VA_STD #if SM_VA_STD
sm_exc_raisenew_x( sm_exc_raisenew_x(
const SM_EXC_TYPE_T *etype, const SM_EXC_TYPE_T *etype,

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 2001-2003 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* *
* By using this file, you agree to the terms and conditions set * By using this file, you agree to the terms and conditions set
@ -8,7 +8,7 @@
*/ */
#include <sm/gen.h> #include <sm/gen.h>
SM_RCSID("@(#)$Id: ldap.c,v 1.44.2.3 2003/07/07 20:16:16 gshapiro Exp $") SM_RCSID("@(#)$Id: ldap.c,v 1.44.2.5 2003/12/23 21:21:56 gshapiro Exp $")
#if LDAPMAP #if LDAPMAP
# include <sys/types.h> # include <sys/types.h>
@ -570,9 +570,11 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result,
** no need to spin through attributes ** no need to spin through attributes
*/ */
if (statp == EX_OK && if (bitset(SM_LDAP_MATCHONLY, flags))
bitset(SM_LDAP_MATCHONLY, flags)) {
statp = EX_OK;
continue; continue;
}
/* record completed DN's to prevent loops */ /* record completed DN's to prevent loops */
dn = ldap_get_dn(lmap->ldap_ld, entry); dn = ldap_get_dn(lmap->ldap_ld, entry);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 2000-2002, 2004 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* Copyright (c) 1990, 1993 * Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved. * The Regents of the University of California. All rights reserved.
@ -11,7 +11,7 @@
* forth in the LICENSE file which can be found at the top level of * forth in the LICENSE file which can be found at the top level of
* the sendmail distribution. * the sendmail distribution.
* *
* $Id: local.h,v 1.51.2.1 2002/09/09 21:38:08 gshapiro Exp $ * $Id: local.h,v 1.51.2.2 2004/01/09 18:32:44 ca Exp $
*/ */
/* /*
@ -37,7 +37,6 @@ int sm_wsetup __P((SM_FILE_T *));
int sm_flags __P((int)); int sm_flags __P((int));
SM_FILE_T *sm_fp __P((const SM_FILE_T *, const int, SM_FILE_T *)); SM_FILE_T *sm_fp __P((const SM_FILE_T *, const int, SM_FILE_T *));
int sm_vprintf __P((int, char const *, va_list)); int sm_vprintf __P((int, char const *, va_list));
int sm_vfscanf __P((SM_FILE_T *, int, char const *, va_list));
/* std io functions */ /* std io functions */
ssize_t sm_stdread __P((SM_FILE_T *, char *, size_t)); ssize_t sm_stdread __P((SM_FILE_T *, char *, size_t));

View File

@ -9,9 +9,9 @@
.\" the sendmail distribution. .\" the sendmail distribution.
.\" .\"
.\" .\"
.\" $Id: smrsh.8,v 8.16.2.1 2003/07/08 01:33:03 gshapiro Exp $ .\" $Id: smrsh.8,v 8.16.2.2 2003/10/07 18:05:37 ca Exp $
.\" .\"
.TH SMRSH 8 "$Date: 2003/07/08 01:33:03 $" .TH SMRSH 8 "$Date: 2003/10/07 18:05:37 $"
.SH NAME .SH NAME
smrsh \- restricted shell for sendmail smrsh \- restricted shell for sendmail
.SH SYNOPSIS .SH SYNOPSIS
@ -88,6 +88,11 @@ and/or \-DSMRSH_CMDDIR=\e"\fIdir\fP\e"
to change the default program directory to change the default program directory
(defaults to ``/usr/adm/sm.bin''). (defaults to ``/usr/adm/sm.bin'').
.SH FILES .SH FILES
/usr/adm/sm.bin \- directory for restricted programs /usr/adm/sm.bin \- default directory for restricted programs on most OSs
.PP
/var/adm/sm.bin \- directory for restricted programs on HP UX and Solaris
.PP
/usr/libexec/sm.bin \- directory for restricted programs on FreeBSD (>= 3.3)
.SH SEE ALSO .SH SEE ALSO
sendmail(8) sendmail(8)

View File

@ -20,7 +20,7 @@ SM_IDSTR(copyright,
Copyright (c) 1993\n\ Copyright (c) 1993\n\
The Regents of the University of California. All rights reserved.\n") The Regents of the University of California. All rights reserved.\n")
SM_IDSTR(id, "@(#)$Id: smrsh.c,v 8.58.2.2 2002/09/24 21:40:05 ca Exp $") SM_IDSTR(id, "@(#)$Id: smrsh.c,v 8.58.2.5 2003/12/15 17:09:39 ca Exp $")
/* /*
** SMRSH -- sendmail restricted shell ** SMRSH -- sendmail restricted shell
@ -118,8 +118,9 @@ addcmd(s, cmd, len)
if (s == NULL || *s == '\0') if (s == NULL || *s == '\0')
return; return;
/* enough space for s (len) and CMDDIR + "/" and '\0'? */
if (sizeof newcmdbuf - strlen(newcmdbuf) <= if (sizeof newcmdbuf - strlen(newcmdbuf) <=
len + (cmd ? (strlen(CMDDIR) + 1) : 0)) len + 1 + (cmd ? (strlen(CMDDIR) + 1) : 0))
{ {
(void)sm_io_fprintf(smioerr, SM_TIME_DEFAULT, (void)sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
"%s: command too long: %s\n", prg, par); "%s: command too long: %s\n", prg, par);
@ -130,7 +131,7 @@ addcmd(s, cmd, len)
} }
if (cmd) if (cmd)
(void) sm_strlcat2(newcmdbuf, CMDDIR, "/", sizeof newcmdbuf); (void) sm_strlcat2(newcmdbuf, CMDDIR, "/", sizeof newcmdbuf);
(void) sm_strlcat(newcmdbuf, s, sizeof newcmdbuf); (void) strncat(newcmdbuf, s, len);
} }
int int
@ -423,7 +424,8 @@ main(argc, argv)
#ifdef DEBUG #ifdef DEBUG
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%s\n", newcmdbuf); (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%s\n", newcmdbuf);
#endif /* DEBUG */ #endif /* DEBUG */
(void) execle("/bin/sh", "/bin/sh", "-c", newcmdbuf, NULL, newenv); (void) execle("/bin/sh", "/bin/sh", "-c", newcmdbuf,
(char *)NULL, newenv);
save_errno = errno; save_errno = errno;
#ifndef DEBUG #ifndef DEBUG
syslog(LOG_CRIT, "Cannot exec /bin/sh: %s", sm_errstring(errno)); syslog(LOG_CRIT, "Cannot exec /bin/sh: %s", sm_errstring(errno));

View File

@ -9,7 +9,7 @@
# the sendmail distribution. # the sendmail distribution.
# #
# #
# $Id: README,v 8.355.2.15 2003/06/02 01:43:04 ca Exp $ # $Id: README,v 8.355.2.16 2004/01/08 21:54:55 ca Exp $
# #
This directory contains the source files for sendmail(TM). This directory contains the source files for sendmail(TM).
@ -561,6 +561,11 @@ MATCHGECOS Permit fuzzy matching of user names against the full
MIME8TO7 If non-zero, include 8 to 7 bit MIME conversions. This MIME8TO7 If non-zero, include 8 to 7 bit MIME conversions. This
also controls advertisement of 8BITMIME in the ESMTP also controls advertisement of 8BITMIME in the ESMTP
startup dialogue. startup dialogue.
MIME7TO8_OLD If 0 then use an algorithm for MIME 7-bit quoted-printable
or base64 encoding to 8-bit text that has been introduced
in 8.12.3. There are some examples where that code fails,
but the old code works. If you have an example of improper
7 to 8 bit conversion please send it to sendmail-bugs.
MIME7TO8 If non-zero, include 7 to 8 bit MIME conversions. MIME7TO8 If non-zero, include 7 to 8 bit MIME conversions.
HES_GETMAILHOST Define this to 1 if you are using Hesiod with the HES_GETMAILHOST Define this to 1 if you are using Hesiod with the
hes_getmailhost() routine. This is included with the MIT hes_getmailhost() routine. This is included with the MIT
@ -1797,4 +1802,4 @@ util.c Some general purpose routines used by sendmail.
version.c The version number and information about this version.c The version number and information about this
version of sendmail. version of sendmail.
(Version $Revision: 8.355.2.15 $, last update $Date: 2003/06/02 01:43:04 $ ) (Version $Revision: 8.355.2.16 $, last update $Date: 2004/01/08 21:54:55 $ )

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993 * Copyright (c) 1988, 1993
@ -13,7 +13,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: alias.c,v 8.214.2.1 2003/07/28 17:47:55 ca Exp $") SM_RCSID("@(#)$Id: alias.c,v 8.214.2.2 2003/10/06 20:43:29 ca Exp $")
#define SEPARATOR ':' #define SEPARATOR ':'
# define ALIAS_SPEC_SEPARATORS " ,/:" # define ALIAS_SPEC_SEPARATORS " ,/:"

View File

@ -13,7 +13,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: conf.c,v 8.972.2.50 2003/09/03 21:37:03 ca Exp $") SM_RCSID("@(#)$Id: conf.c,v 8.972.2.54 2004/01/08 21:54:55 ca Exp $")
#include <sendmail/pathnames.h> #include <sendmail/pathnames.h>
#if NEWDB #if NEWDB
@ -5571,6 +5571,9 @@ char *CompileOptions[] =
#if MIME7TO8 #if MIME7TO8
"MIME7TO8", "MIME7TO8",
#endif /* MIME7TO8 */ #endif /* MIME7TO8 */
#if MIME7TO8_OLD
"MIME7TO8_OLD",
#endif /* MIME7TO8_OLD */
#if MIME8TO7 #if MIME8TO7
"MIME8TO7", "MIME8TO7",
#endif /* MIME8TO7 */ #endif /* MIME8TO7 */
@ -6065,11 +6068,19 @@ char *FFRCompileOptions[] =
/* Limit sleep(2) time in libsm/clock.c */ /* Limit sleep(2) time in libsm/clock.c */
"_FFR_MAX_SLEEP_TIME", "_FFR_MAX_SLEEP_TIME",
#endif /* _FFR_MAX_SLEEP_TIME */ #endif /* _FFR_MAX_SLEEP_TIME */
#if _FFR_MESSAGEID_MACRO
/* stick the message ID header's value in a macro */
"_FFR_MESSAGEID_MACRO",
#endif /* _FFR_MESSAGEID_MACRO */
#if MILTER #if MILTER
# if _FFR_MILTER_421 # if _FFR_MILTER_421
/* If a filter returns 421, close the SMTP connection */ /* If a filter returns 421, close the SMTP connection */
"_FFR_MILTER_421", "_FFR_MILTER_421",
# endif /* _FFR_MILTER_421 */ # endif /* _FFR_MILTER_421 */
# if _FFR_MILTER_MACROS_EOM
/* Add an EOM macro set for milter */
"_FFR_MILTER_MACROS_EOM",
# endif /* _FFR_MILTER_MACROS_EOM */
# if _FFR_MILTER_PERDAEMON # if _FFR_MILTER_PERDAEMON
/* Per DaemonPortOptions InputMailFilter lists */ /* Per DaemonPortOptions InputMailFilter lists */
"_FFR_MILTER_PERDAEMON", "_FFR_MILTER_PERDAEMON",

View File

@ -13,7 +13,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: daemon.c,v 8.613.2.17 2003/07/30 20:17:04 ca Exp $") SM_RCSID("@(#)$Id: daemon.c,v 8.613.2.20 2003/11/25 19:02:24 ca Exp $")
#if defined(SOCK_STREAM) || defined(__GNU_LIBRARY__) #if defined(SOCK_STREAM) || defined(__GNU_LIBRARY__)
# define USE_SOCK_STREAM 1 # define USE_SOCK_STREAM 1
@ -164,6 +164,8 @@ getrequests(e)
extern bool refuseconnections __P((char *, ENVELOPE *, int, bool)); extern bool refuseconnections __P((char *, ENVELOPE *, int, bool));
/* initialize data for function that generates queue ids */
init_qid_alg();
for (idx = 0; idx < NDaemons; idx++) for (idx = 0; idx < NDaemons; idx++)
{ {
Daemons[idx].d_port = setupdaemon(&(Daemons[idx].d_addr)); Daemons[idx].d_port = setupdaemon(&(Daemons[idx].d_addr));
@ -363,7 +365,6 @@ getrequests(e)
/* Did someone signal while waiting? */ /* Did someone signal while waiting? */
CHECK_RESTART; CHECK_RESTART;
curdaemon = -1; curdaemon = -1;
if (doqueuerun()) if (doqueuerun())
{ {
@ -3484,10 +3485,21 @@ getauthinfo(fd, may_be_forged)
nleft = sizeof ibuf - 1; nleft = sizeof ibuf - 1;
while ((i = read(s, p, nleft)) > 0) while ((i = read(s, p, nleft)) > 0)
{ {
char *s;
p += i; p += i;
nleft -= i; nleft -= i;
*p = '\0'; *p = '\0';
if (strchr(ibuf, '\n') != NULL || nleft <= 0) if ((s = strchr(ibuf, '\n')) != NULL)
{
if (p > s + 1)
{
p = s + 1;
*p = '\0';
}
break;
}
if (nleft <= 0)
break; break;
} }
(void) close(s); (void) close(s);

View File

@ -14,7 +14,7 @@
#include <sendmail.h> #include <sendmail.h>
#include <sys/time.h> #include <sys/time.h>
SM_RCSID("@(#)$Id: deliver.c,v 8.940.2.19 2003/09/03 19:58:26 ca Exp $") SM_RCSID("@(#)$Id: deliver.c,v 8.940.2.20 2003/09/26 18:26:19 ca Exp $")
#if HASSETUSERCONTEXT #if HASSETUSERCONTEXT
# include <login_cap.h> # include <login_cap.h>
@ -3491,7 +3491,12 @@ do_transfer:
(mci->mci_state == MCIS_MAIL || (mci->mci_state == MCIS_MAIL ||
mci->mci_state == MCIS_RCPT || mci->mci_state == MCIS_RCPT ||
mci->mci_state == MCIS_DATA)) mci->mci_state == MCIS_DATA))
{
mci->mci_state = MCIS_OPEN; mci->mci_state = MCIS_OPEN;
SmtpPhase = mci->mci_phase = "idle";
sm_setproctitle(true, e, "%s: %s", CurHostName,
mci->mci_phase);
}
} }
if (tobuf[0] != '\0') if (tobuf[0] != '\0')

View File

@ -13,7 +13,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: headers.c,v 8.266.4.7 2003/09/03 21:32:20 ca Exp $") SM_RCSID("@(#)$Id: headers.c,v 8.266.4.9 2003/10/30 00:17:22 gshapiro Exp $")
static size_t fix_mime_header __P((HDR *, ENVELOPE *)); static size_t fix_mime_header __P((HDR *, ENVELOPE *));
static int priencode __P((char *)); static int priencode __P((char *));
@ -730,6 +730,10 @@ eatheader(e, full, log)
e->e_msgid = h->h_value; e->e_msgid = h->h_value;
while (isascii(*e->e_msgid) && isspace(*e->e_msgid)) while (isascii(*e->e_msgid) && isspace(*e->e_msgid))
e->e_msgid++; e->e_msgid++;
#if _FFR_MESSAGEID_MACRO
macdefine(&e->e_macro, A_PERM, macid("{msg_id}"),
e->e_msgid);
#endif /* _FFR_MESSAGEID_MACRO */
} }
} }
if (tTd(32, 1)) if (tTd(32, 1))
@ -773,11 +777,13 @@ eatheader(e, full, log)
e->e_timeoutclass = TOC_NORMAL; e->e_timeoutclass = TOC_NORMAL;
else if (sm_strcasecmp(p, "non-urgent") == 0) else if (sm_strcasecmp(p, "non-urgent") == 0)
e->e_timeoutclass = TOC_NONURGENT; e->e_timeoutclass = TOC_NONURGENT;
}
#if _FFR_QUEUERETURN_DSN #if _FFR_QUEUERETURN_DSN
/* If no timeoutclass picked and it's a DSN, use that timeoutclass */ else if (bitset(EF_RESPONSE, e->e_flags))
if (e->e_timeoutclass == TOC_NORMAL && bitset(EF_RESPONSE, e->e_flags)) e->e_timeoutclass = TOC_DSN;
#endif /* _FFR_QUEUERETURN_DSN */
}
#if _FFR_QUEUERETURN_DSN
else if (bitset(EF_RESPONSE, e->e_flags))
e->e_timeoutclass = TOC_DSN; e->e_timeoutclass = TOC_DSN;
#endif /* _FFR_QUEUERETURN_DSN */ #endif /* _FFR_QUEUERETURN_DSN */

View File

@ -25,7 +25,7 @@ SM_UNUSED(static char copyright[]) =
The Regents of the University of California. All rights reserved.\n"; The Regents of the University of California. All rights reserved.\n";
#endif /* ! lint */ #endif /* ! lint */
SM_RCSID("@(#)$Id: main.c,v 8.887.2.27 2003/08/04 17:23:37 ca Exp $") SM_RCSID("@(#)$Id: main.c,v 8.887.2.29 2003/11/07 00:09:31 ca Exp $")
#if NETINET || NETINET6 #if NETINET || NETINET6
@ -2234,8 +2234,32 @@ main(argc, argv, envp)
int status; int status;
pid_t ret; pid_t ret;
errno = 0;
while ((ret = sm_wait(&status)) <= 0) while ((ret = sm_wait(&status)) <= 0)
{
if (errno == ECHILD)
{
/*
** Oops... something got messed
** up really bad. Waiting for
** non-existent children
** shouldn't happen. Let's get
** out of here.
*/
CurChildren = 0;
break;
}
continue; continue;
}
/* something is really really wrong */
if (errno == ECHILD)
{
sm_syslog(LOG_ERR, NOQID,
"queue control process: lost all children: wait returned ECHILD");
break;
}
/* Only drop when a child gives status */ /* Only drop when a child gives status */
if (WIFSTOPPED(status)) if (WIFSTOPPED(status))
@ -2371,8 +2395,31 @@ main(argc, argv, envp)
int group; int group;
CHECK_RESTART; CHECK_RESTART;
errno = 0;
while ((ret = sm_wait(&status)) <= 0) while ((ret = sm_wait(&status)) <= 0)
{
/*
** Waiting for non-existent
** children shouldn't happen.
** Let's get out of here if
** it occurs.
*/
if (errno == ECHILD)
{
CurChildren = 0;
break;
}
continue; continue;
}
/* something is really really wrong */
if (errno == ECHILD)
{
sm_syslog(LOG_ERR, NOQID,
"persistent queue runner control process: lost all children: wait returned ECHILD");
break;
}
if (WIFSTOPPED(status)) if (WIFSTOPPED(status))
continue; continue;

View File

@ -10,7 +10,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: milter.c,v 8.197.2.9 2003/09/07 00:18:29 ca Exp $") SM_RCSID("@(#)$Id: milter.c,v 8.197.2.10 2003/12/01 23:57:44 msk Exp $")
#if MILTER #if MILTER
# include <libmilter/mfapi.h> # include <libmilter/mfapi.h>
@ -34,6 +34,9 @@ static char *MilterConnectMacros[MAXFILTERMACROS + 1];
static char *MilterHeloMacros[MAXFILTERMACROS + 1]; static char *MilterHeloMacros[MAXFILTERMACROS + 1];
static char *MilterEnvFromMacros[MAXFILTERMACROS + 1]; static char *MilterEnvFromMacros[MAXFILTERMACROS + 1];
static char *MilterEnvRcptMacros[MAXFILTERMACROS + 1]; static char *MilterEnvRcptMacros[MAXFILTERMACROS + 1];
#if _FFR_MILTER_MACROS_EOM
static char *MilterEOMMacros[MAXFILTERMACROS + 1];
#endif /* _FFR_MILTER_MACROS_EOM */
# define MILTER_CHECK_DONE_MSG() \ # define MILTER_CHECK_DONE_MSG() \
if (*state == SMFIR_REPLYCODE || \ if (*state == SMFIR_REPLYCODE || \
@ -1415,6 +1418,10 @@ static struct milteropt
{ "macros.envrcpt", MO_MACROS_ENVRCPT }, { "macros.envrcpt", MO_MACROS_ENVRCPT },
# define MO_LOGLEVEL 0x05 # define MO_LOGLEVEL 0x05
{ "loglevel", MO_LOGLEVEL }, { "loglevel", MO_LOGLEVEL },
#if _FFR_MILTER_MACROS_EOM
# define MO_MACROS_EOM 0x06
{ "macros.eom", MO_MACROS_EOM },
#endif /* _FFR_MILTER_MACROS_EOM */
{ NULL, 0 }, { NULL, 0 },
}; };
@ -1488,6 +1495,13 @@ milter_set_option(name, val, sticky)
case MO_MACROS_ENVRCPT: case MO_MACROS_ENVRCPT:
if (macros == NULL) if (macros == NULL)
macros = MilterEnvRcptMacros; macros = MilterEnvRcptMacros;
#if _FFR_MILTER_MACROS_EOM
/* FALLTHROUGH */
case MO_MACROS_EOM:
if (macros == NULL)
macros = MilterEOMMacros;
#endif /* _FFR_MILTER_MACROS_EOM */
p = newstr(val); p = newstr(val);
while (*p != '\0') while (*p != '\0')
@ -3594,6 +3608,11 @@ milter_data(e, state)
MILTER_CHECK_RESULTS(); MILTER_CHECK_RESULTS();
} }
#if _FFR_MILTER_MACROS_EOM
if (MilterEOMMacros[0] != NULL)
milter_send_macros(m, MilterEOMMacros, SMFIC_BODYEOB, e);
#endif /* _FFR_MILTER_MACROS_EOM */
/* send the final body chunk */ /* send the final body chunk */
(void) milter_write(m, SMFIC_BODYEOB, NULL, 0, (void) milter_write(m, SMFIC_BODYEOB, NULL, 0,
m->mf_timeout[SMFTO_WRITE], e); m->mf_timeout[SMFTO_WRITE], e);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* Copyright (c) 1994, 1996-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1994, 1996-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1994 * Copyright (c) 1994
@ -14,7 +14,7 @@
#include <sendmail.h> #include <sendmail.h>
#include <string.h> #include <string.h>
SM_RCSID("@(#)$Id: mime.c,v 8.130.2.1 2003/04/15 01:05:59 ca Exp $") SM_RCSID("@(#)$Id: mime.c,v 8.130.2.3 2004/01/08 21:42:56 ca Exp $")
/* /*
** MIME support. ** MIME support.
@ -33,6 +33,11 @@ SM_RCSID("@(#)$Id: mime.c,v 8.130.2.1 2003/04/15 01:05:59 ca Exp $")
** the problem. ** the problem.
*/ */
/* use "old" mime 7 to 8 algorithm by default */
#ifndef MIME7TO8_OLD
# define MIME7TO8_OLD 1
#endif /* ! MIME7TO8_OLD */
#if MIME8TO7 #if MIME8TO7
static int isboundary __P((char *, char **)); static int isboundary __P((char *, char **));
static int mimeboundary __P((char *, char **)); static int mimeboundary __P((char *, char **));
@ -1064,54 +1069,41 @@ mime7to8(mci, header, e)
c1 = CHAR64(c1); c1 = CHAR64(c1);
c2 = CHAR64(c2); c2 = CHAR64(c2);
#if MIME7TO8_OLD
#define CHK_EOL if (*--fbufp != '\n' || (fbufp > fbuf && *--fbufp != '\r')) \
++fbufp;
#else /* MIME7TO8_OLD */
#define CHK_EOL if (*--fbufp != '\n' || (fbufp > fbuf && *--fbufp != '\r')) \
{ \
++fbufp; \
pxflags |= PXLF_NOADDEOL; \
}
#endif /* MIME7TO8_OLD */
#define PUTLINE64 \
do \
{ \
if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) \
{ \
CHK_EOL; \
putxline((char *) fbuf, fbufp - fbuf, mci, pxflags); \
pxflags &= ~PXLF_NOADDEOL; \
fbufp = fbuf; \
} \
} while (0)
*fbufp = (c1 << 2) | ((c2 & 0x30) >> 4); *fbufp = (c1 << 2) | ((c2 & 0x30) >> 4);
if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) PUTLINE64;
{
if (*--fbufp != '\n' ||
(fbufp > fbuf && *--fbufp != '\r'))
{
pxflags |= PXLF_NOADDEOL;
fbufp++;
}
putxline((char *) fbuf, fbufp - fbuf,
mci, pxflags);
pxflags &= ~PXLF_NOADDEOL;
fbufp = fbuf;
}
if (c3 == '=') if (c3 == '=')
continue; continue;
c3 = CHAR64(c3); c3 = CHAR64(c3);
*fbufp = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); *fbufp = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2);
if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) PUTLINE64;
{
if (*--fbufp != '\n' ||
(fbufp > fbuf && *--fbufp != '\r'))
{
pxflags |= PXLF_NOADDEOL;
fbufp++;
}
putxline((char *) fbuf, fbufp - fbuf,
mci, pxflags);
pxflags &= ~PXLF_NOADDEOL;
fbufp = fbuf;
}
if (c4 == '=') if (c4 == '=')
continue; continue;
c4 = CHAR64(c4); c4 = CHAR64(c4);
*fbufp = ((c3 & 0x03) << 6) | c4; *fbufp = ((c3 & 0x03) << 6) | c4;
if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) PUTLINE64;
{
if (*--fbufp != '\n' ||
(fbufp > fbuf && *--fbufp != '\r'))
{
pxflags |= PXLF_NOADDEOL;
fbufp++;
}
putxline((char *) fbuf, fbufp - fbuf,
mci, pxflags);
pxflags &= ~PXLF_NOADDEOL;
fbufp = fbuf;
}
} }
} }
else else

View File

@ -13,7 +13,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: queue.c,v 8.863.2.61 2003/09/03 19:58:26 ca Exp $") SM_RCSID("@(#)$Id: queue.c,v 8.863.2.67 2003/12/02 23:56:01 ca Exp $")
#include <dirent.h> #include <dirent.h>
@ -22,7 +22,16 @@ SM_RCSID("@(#)$Id: queue.c,v 8.863.2.61 2003/09/03 19:58:26 ca Exp $")
# define sm_file_exists(errno) ((errno) == EEXIST) # define sm_file_exists(errno) ((errno) == EEXIST)
# if HASFLOCK && defined(O_EXLOCK)
# define SM_OPEN_EXLOCK 1
# define TF_OPEN_FLAGS (O_CREAT|O_WRONLY|O_EXCL|O_EXLOCK)
# else /* HASFLOCK && defined(O_EXLOCK) */
# define TF_OPEN_FLAGS (O_CREAT|O_WRONLY|O_EXCL) # define TF_OPEN_FLAGS (O_CREAT|O_WRONLY|O_EXCL)
# endif /* HASFLOCK && defined(O_EXLOCK) */
#ifndef SM_OPEN_EXLOCK
# define SM_OPEN_EXLOCK 0
#endif /* ! SM_OPEN_EXLOCK */
/* /*
** Historical notes: ** Historical notes:
@ -358,6 +367,18 @@ queueup(e, announce, msync)
** Create control file. ** Create control file.
*/ */
#define OPEN_TF do \
{ \
MODE_T oldumask = 0; \
\
if (bitset(S_IWGRP, QueueFileMode)) \
oldumask = umask(002); \
tfd = open(tf, TF_OPEN_FLAGS, QueueFileMode); \
if (bitset(S_IWGRP, QueueFileMode)) \
(void) umask(oldumask); \
} while (0)
newid = (e->e_id == NULL) || !bitset(EF_INQUEUE, e->e_flags); newid = (e->e_id == NULL) || !bitset(EF_INQUEUE, e->e_flags);
(void) sm_strlcpy(tf, queuename(e, NEWQFL_LETTER), sizeof tf); (void) sm_strlcpy(tf, queuename(e, NEWQFL_LETTER), sizeof tf);
tfp = e->e_lockfp; tfp = e->e_lockfp;
@ -370,9 +391,11 @@ queueup(e, announce, msync)
*/ */
(void) sm_strlcpy(tf, queuename(e, ANYQFL_LETTER), sizeof tf); (void) sm_strlcpy(tf, queuename(e, ANYQFL_LETTER), sizeof tf);
tfd = open(tf, TF_OPEN_FLAGS, FileMode); OPEN_TF;
if (tfd < 0 || if (tfd < 0 ||
#if !SM_OPEN_EXLOCK
!lockfile(tfd, tf, NULL, LOCK_EX|LOCK_NB) || !lockfile(tfd, tf, NULL, LOCK_EX|LOCK_NB) ||
#endif /* !SM_OPEN_EXLOCK */
(tfp = sm_io_open(SmFtStdiofd, SM_TIME_DEFAULT, (tfp = sm_io_open(SmFtStdiofd, SM_TIME_DEFAULT,
(void *) &tfd, SM_IO_WRONLY_B, (void *) &tfd, SM_IO_WRONLY_B,
NULL)) == NULL) NULL)) == NULL)
@ -396,14 +419,7 @@ queueup(e, announce, msync)
{ {
if (tfd < 0) if (tfd < 0)
{ {
MODE_T oldumask = 0; OPEN_TF;
if (bitset(S_IWGRP, QueueFileMode))
oldumask = umask(002);
tfd = open(tf, TF_OPEN_FLAGS, QueueFileMode);
if (bitset(S_IWGRP, QueueFileMode))
(void) umask(oldumask);
if (tfd < 0) if (tfd < 0)
{ {
if (errno != EEXIST) if (errno != EEXIST)
@ -414,12 +430,22 @@ queueup(e, announce, msync)
tf, (int) geteuid(), tf, (int) geteuid(),
sm_errstring(errno)); sm_errstring(errno));
} }
#if SM_OPEN_EXLOCK
else
break;
#endif /* SM_OPEN_EXLOCK */
} }
if (tfd >= 0) if (tfd >= 0)
{ {
#if SM_OPEN_EXLOCK
/* file is locked by open() */
break;
#else /* SM_OPEN_EXLOCK */
if (lockfile(tfd, tf, NULL, LOCK_EX|LOCK_NB)) if (lockfile(tfd, tf, NULL, LOCK_EX|LOCK_NB))
break; break;
else if (LogLevel > 0 && (i % 32) == 0) else
#endif /* SM_OPEN_EXLOCK */
if (LogLevel > 0 && (i % 32) == 0)
sm_syslog(LOG_ALERT, e->e_id, sm_syslog(LOG_ALERT, e->e_id,
"queueup: cannot lock %s: %s", "queueup: cannot lock %s: %s",
tf, sm_errstring(errno)); tf, sm_errstring(errno));
@ -5172,6 +5198,36 @@ queuename(e, type)
sm_dprintf("queuename: %s\n", buf); sm_dprintf("queuename: %s\n", buf);
return buf; return buf;
} }
/*
** INIT_QID_ALG -- Initialize the (static) parameters that are used to
** generate a queue ID.
**
** This function is called by the daemon to reset
** LastQueueTime and LastQueuePid which are used by assign_queueid().
** Otherwise the algorithm may cause problems because
** LastQueueTime and LastQueuePid are set indirectly by main()
** before the daemon process is started, hence LastQueuePid is not
** the pid of the daemon and therefore a child of the daemon can
** actually have the same pid as LastQueuePid which means the section
** in assign_queueid():
** * see if we need to get a new base time/pid *
** is NOT triggered which will cause the same queue id to be generated.
**
** Parameters:
** none
**
** Returns:
** none.
*/
void
init_qid_alg()
{
LastQueueTime = 0;
LastQueuePid = -1;
}
/* /*
** ASSIGN_QUEUEID -- assign a queue ID for this envelope. ** ASSIGN_QUEUEID -- assign a queue ID for this envelope.
** **
@ -5188,8 +5244,20 @@ queuename(e, type)
** none. ** none.
*/ */
static const char QueueIdChars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx"; static const char QueueIdChars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
# define QIC_LEN 60 # define QIC_LEN 60
# define QIC_LEN_R 62
/*
** Note: the length is "officially" 60 because minutes and seconds are
** usually only 0-59. However (Linux):
** tm_sec The number of seconds after the minute, normally in
** the range 0 to 59, but can be up to 61 to allow for
** leap seconds.
** Hence the real length of the string is 62 to take this into account.
** Alternatively % QIC_LEN can (should) be used for access everywhere.
*/
# define queuenextid() CurrentPid # define queuenextid() CurrentPid
@ -5244,8 +5312,8 @@ assign_queueid(e)
idbuf[1] = QueueIdChars[tm->tm_mon]; idbuf[1] = QueueIdChars[tm->tm_mon];
idbuf[2] = QueueIdChars[tm->tm_mday]; idbuf[2] = QueueIdChars[tm->tm_mday];
idbuf[3] = QueueIdChars[tm->tm_hour]; idbuf[3] = QueueIdChars[tm->tm_hour];
idbuf[4] = QueueIdChars[tm->tm_min]; idbuf[4] = QueueIdChars[tm->tm_min % QIC_LEN_R];
idbuf[5] = QueueIdChars[tm->tm_sec]; idbuf[5] = QueueIdChars[tm->tm_sec % QIC_LEN_R];
idbuf[6] = QueueIdChars[seq / QIC_LEN]; idbuf[6] = QueueIdChars[seq / QIC_LEN];
idbuf[7] = QueueIdChars[seq % QIC_LEN]; idbuf[7] = QueueIdChars[seq % QIC_LEN];
(void) sm_snprintf(&idbuf[8], sizeof idbuf - 8, "%06d", (void) sm_snprintf(&idbuf[8], sizeof idbuf - 8, "%06d",
@ -7357,10 +7425,10 @@ cmpidx(a, b)
void void
makeworkgroups() makeworkgroups()
{ {
int i, j, total_runners = 0; int i, j, total_runners, dir, h;
int dir;
SORTQGRP_T si[MAXQUEUEGROUPS + 1]; SORTQGRP_T si[MAXQUEUEGROUPS + 1];
total_runners = 0;
if (NumQueue == 1 && strcmp(Queue[0]->qg_name, "mqueue") == 0) if (NumQueue == 1 && strcmp(Queue[0]->qg_name, "mqueue") == 0)
{ {
/* /*
@ -7456,18 +7524,19 @@ makeworkgroups()
(WorkGrp[j].wg_numqgrp + 1))); (WorkGrp[j].wg_numqgrp + 1)));
} }
WorkGrp[j].wg_qgs[WorkGrp[j].wg_numqgrp] = Queue[si[i].sg_idx]; h = si[i].sg_idx;
WorkGrp[j].wg_qgs[WorkGrp[j].wg_numqgrp] = Queue[h];
WorkGrp[j].wg_numqgrp++; WorkGrp[j].wg_numqgrp++;
WorkGrp[j].wg_runners += Queue[i]->qg_maxqrun; WorkGrp[j].wg_runners += Queue[h]->qg_maxqrun;
Queue[si[i].sg_idx]->qg_wgrp = j; Queue[h]->qg_wgrp = j;
if (WorkGrp[j].wg_maxact == 0) if (WorkGrp[j].wg_maxact == 0)
{ {
/* can't have more runners than allowed total */ /* can't have more runners than allowed total */
if (MaxQueueChildren > 0 && if (MaxQueueChildren > 0 &&
Queue[i]->qg_maxqrun > MaxQueueChildren) Queue[h]->qg_maxqrun > MaxQueueChildren)
Queue[i]->qg_maxqrun = MaxQueueChildren; Queue[h]->qg_maxqrun = MaxQueueChildren;
WorkGrp[j].wg_maxact = Queue[i]->qg_maxqrun; WorkGrp[j].wg_maxact = Queue[h]->qg_maxqrun;
} }
/* /*
@ -7477,9 +7546,9 @@ makeworkgroups()
*/ */
/* keep track of the lowest interval for a persistent runner */ /* keep track of the lowest interval for a persistent runner */
if (Queue[si[i].sg_idx]->qg_queueintvl > 0 && if (Queue[h]->qg_queueintvl > 0 &&
WorkGrp[j].wg_lowqintvl < Queue[si[i].sg_idx]->qg_queueintvl) WorkGrp[j].wg_lowqintvl < Queue[h]->qg_queueintvl)
WorkGrp[j].wg_lowqintvl = Queue[si[i].sg_idx]->qg_queueintvl; WorkGrp[j].wg_lowqintvl = Queue[h]->qg_queueintvl;
j += dir; j += dir;
} }
if (tTd(41, 9)) if (tTd(41, 9))

View File

@ -13,7 +13,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: readcf.c,v 8.607.2.11 2003/04/03 23:04:06 ca Exp $") SM_RCSID("@(#)$Id: readcf.c,v 8.607.2.12 2003/10/07 17:45:28 ca Exp $")
#if NETINET || NETINET6 #if NETINET || NETINET6
# include <arpa/inet.h> # include <arpa/inet.h>
@ -3153,7 +3153,7 @@ setoption(opt, val, safe, sticky, e)
RunAsGid = pw->pw_gid; RunAsGid = pw->pw_gid;
else if (UseMSP && *p == '\0') else if (UseMSP && *p == '\0')
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
"WARNING: RunAsGid for MSP ignored, check group ids (egid=%d, want=%d)\n", "WARNING: RunAsUser for MSP ignored, check group ids (egid=%d, want=%d)\n",
(int) EffGid, (int) EffGid,
(int) pw->pw_gid); (int) pw->pw_gid);
} }
@ -3177,7 +3177,7 @@ setoption(opt, val, safe, sticky, e)
else if (UseMSP) else if (UseMSP)
(void) sm_io_fprintf(smioout, (void) sm_io_fprintf(smioout,
SM_TIME_DEFAULT, SM_TIME_DEFAULT,
"WARNING: RunAsGid for MSP ignored, check group ids (egid=%d, want=%d)\n", "WARNING: RunAsUser for MSP ignored, check group ids (egid=%d, want=%d)\n",
(int) EffGid, (int) EffGid,
(int) runasgid); (int) runasgid);
} }
@ -3194,7 +3194,7 @@ setoption(opt, val, safe, sticky, e)
else if (UseMSP) else if (UseMSP)
(void) sm_io_fprintf(smioout, (void) sm_io_fprintf(smioout,
SM_TIME_DEFAULT, SM_TIME_DEFAULT,
"WARNING: RunAsGid for MSP ignored, check group ids (egid=%d, want=%d)\n", "WARNING: RunAsUser for MSP ignored, check group ids (egid=%d, want=%d)\n",
(int) EffGid, (int) EffGid,
(int) gr->gr_gid); (int) gr->gr_gid);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993 * Copyright (c) 1988, 1993
@ -13,7 +13,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: recipient.c,v 8.330.2.2 2003/09/16 19:56:25 ca Exp $") SM_RCSID("@(#)$Id: recipient.c,v 8.330.2.4 2003/10/06 20:43:29 ca Exp $")
static void includetimeout __P((void)); static void includetimeout __P((void));
static ADDRESS *self_reference __P((ADDRESS *)); static ADDRESS *self_reference __P((ADDRESS *));
@ -397,7 +397,8 @@ removefromlist(list, sendq, e)
for (pq = sendq; (q = *pq) != NULL; pq = &q->q_next) for (pq = sendq; (q = *pq) != NULL; pq = &q->q_next)
{ {
if (!QS_IS_DEAD(q->q_state) && if (!QS_IS_DEAD(q->q_state) &&
sameaddr(q, &a)) (sameaddr(q, &a) ||
strcmp(q->q_paddr, a.q_paddr) == 0))
{ {
if (tTd(25, 5)) if (tTd(25, 5))
{ {

View File

@ -9,9 +9,9 @@
.\" the sendmail distribution. .\" the sendmail distribution.
.\" .\"
.\" .\"
.\" $Id: sendmail.8,v 8.51.2.1 2003/05/20 16:38:15 gshapiro Exp $ .\" $Id: sendmail.8,v 8.51.2.3 2003/12/01 17:02:00 ca Exp $
.\" .\"
.TH SENDMAIL 8 "$Date: 2003/05/20 16:38:15 $" .TH SENDMAIL 8 "$Date: 2003/12/01 17:02:00 $"
.SH NAME .SH NAME
sendmail sendmail
\- an electronic mail transport agent \- an electronic mail transport agent
@ -150,11 +150,32 @@ users or mailing lists.
.BI \-C file .BI \-C file
Use alternate configuration file. Use alternate configuration file.
.B Sendmail .B Sendmail
refuses to run as root if an alternate configuration file is specified. gives up any enhanced (set-user-ID or set-group-ID) privileges
if an alternate configuration file is specified.
.TP .TP
.BI \-d X .BI \-d category . level...
Set debugging value to Set the debugging flag for
.IR X . .I category
to
.IR level .
.I Category
is either an integer or a name specifying the topic, and
.I level
an integer specifying the level of debugging output desired.
Higher levels generally mean more output.
More than one flag can be specified by separating them with commas.
A list of numeric debugging categories can be found in the TRACEFLAGS file
in the sendmail source distribution.
.br
The option
.B \-d0.1
prints the version of
.B sendmail
and the options it was compiled with.
.br
Most other categories are only useful with, and documented in,
.BR sendmail 's
source code.
.ne 1i .ne 1i
.TP .TP
.BI \-F fullname .BI \-F fullname

View File

@ -48,7 +48,7 @@
#ifdef _DEFINE #ifdef _DEFINE
# ifndef lint # ifndef lint
SM_UNUSED(static char SmailId[]) = "@(#)$Id: sendmail.h,v 8.919.2.28 2003/09/03 19:58:27 ca Exp $"; SM_UNUSED(static char SmailId[]) = "@(#)$Id: sendmail.h,v 8.919.2.29 2003/11/07 00:08:02 ca Exp $";
# endif /* ! lint */ # endif /* ! lint */
#endif /* _DEFINE */ #endif /* _DEFINE */
@ -1973,6 +1973,7 @@ extern void setup_queues __P((bool));
extern bool setnewqueue __P((ENVELOPE *)); extern bool setnewqueue __P((ENVELOPE *));
extern bool shouldqueue __P((long, time_t)); extern bool shouldqueue __P((long, time_t));
extern void sync_queue_time __P((void)); extern void sync_queue_time __P((void));
extern void init_qid_alg __P((void));
extern int print_single_queue __P((int, int)); extern int print_single_queue __P((int, int));
#if REQUIRES_DIR_FSYNC #if REQUIRES_DIR_FSYNC
# define SYNC_DIR(path, panic) sync_dir(path, panic) # define SYNC_DIR(path, panic) sync_dir(path, panic)

View File

@ -16,7 +16,7 @@
# include <libmilter/mfdef.h> # include <libmilter/mfdef.h>
#endif /* MILTER */ #endif /* MILTER */
SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.829.2.31 2003/07/01 17:30:01 ca Exp $") SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.829.2.34 2004/01/14 19:13:46 ca Exp $")
#if SASL || STARTTLS #if SASL || STARTTLS
# include <sys/time.h> # include <sys/time.h>
@ -1288,6 +1288,7 @@ smtp(nullserver, d_flags, e)
case CMDEHLO: case CMDEHLO:
case CMDNOOP: case CMDNOOP:
case CMDRSET: case CMDRSET:
case CMDERROR:
/* process normally */ /* process normally */
break; break;
@ -2338,6 +2339,29 @@ tlsfail:
case CMDRCPT: /* rcpt -- designate recipient */ case CMDRCPT: /* rcpt -- designate recipient */
DELAY_CONN("RCPT"); DELAY_CONN("RCPT");
if (BadRcptThrottle > 0 &&
n_badrcpts >= BadRcptThrottle)
{
if (LogLevel > 5 &&
n_badrcpts == BadRcptThrottle)
{
sm_syslog(LOG_INFO, e->e_id,
"%s: Possible SMTP RCPT flood, throttling.",
CurSmtpClient);
/* To avoid duplicated message */
n_badrcpts++;
}
/*
** Don't use exponential backoff for now.
** Some servers will open more connections
** and actually overload the receiver even
** more.
*/
(void) sleep(1);
}
if (!smtp.sm_gotmail) if (!smtp.sm_gotmail)
{ {
usrerr("503 5.0.0 Need MAIL before RCPT"); usrerr("503 5.0.0 Need MAIL before RCPT");
@ -2384,29 +2408,6 @@ tlsfail:
e, true); e, true);
macdefine(&e->e_macro, A_PERM, macdefine(&e->e_macro, A_PERM,
macid("{addr_type}"), NULL); macid("{addr_type}"), NULL);
if (BadRcptThrottle > 0 &&
n_badrcpts >= BadRcptThrottle)
{
if (LogLevel > 5 &&
n_badrcpts == BadRcptThrottle)
{
sm_syslog(LOG_INFO, e->e_id,
"%s: Possible SMTP RCPT flood, throttling.",
CurSmtpClient);
/* To avoid duplicated message */
n_badrcpts++;
}
/*
** Don't use exponential backoff for now.
** Some servers will open more connections
** and actually overload the receiver even
** more.
*/
(void) sleep(1);
}
if (Errors > 0) if (Errors > 0)
goto rcpt_done; goto rcpt_done;
if (a == NULL) if (a == NULL)
@ -3146,7 +3147,7 @@ smtp_data(smtp, e)
doublequeue = false; doublequeue = false;
aborting = Errors > 0; aborting = Errors > 0;
if (!aborting && if (!(aborting || bitset(EF_DISCARD, e->e_flags)) &&
#if _FFR_QUARANTINE #if _FFR_QUARANTINE
(QueueMode == QM_QUARANTINE || e->e_quarmsg == NULL) && (QueueMode == QM_QUARANTINE || e->e_quarmsg == NULL) &&
#endif /* _FFR_QUARANTINE */ #endif /* _FFR_QUARANTINE */

View File

@ -10,7 +10,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: tls.c,v 8.79.4.4 2003/03/20 00:03:42 ca Exp $") SM_RCSID("@(#)$Id: tls.c,v 8.79.4.5 2003/12/28 04:23:28 gshapiro Exp $")
#if STARTTLS #if STARTTLS
# include <openssl/err.h> # include <openssl/err.h>
@ -344,30 +344,36 @@ tls_set_verify(ctx, ssl, vrfy)
# define TLS_S_DHPAR_EX 0x00400000 /* DH param file exists */ # define TLS_S_DHPAR_EX 0x00400000 /* DH param file exists */
# define TLS_S_DHPAR_OK 0x00800000 /* DH param file is ok to use */ # define TLS_S_DHPAR_OK 0x00800000 /* DH param file is ok to use */
/* Type of variable */
# define TLS_T_OTHER 0
# define TLS_T_SRV 1
# define TLS_T_CLT 2
/* /*
** TLS_OK_F -- can var be an absolute filename? ** TLS_OK_F -- can var be an absolute filename?
** **
** Parameters: ** Parameters:
** var -- filename ** var -- filename
** fn -- what is the filename used for? ** fn -- what is the filename used for?
** srv -- server side? ** type -- type of variable
** **
** Returns: ** Returns:
** ok? ** ok?
*/ */
static bool static bool
tls_ok_f(var, fn, srv) tls_ok_f(var, fn, type)
char *var; char *var;
char *fn; char *fn;
bool srv; int type;
{ {
/* must be absolute pathname */ /* must be absolute pathname */
if (var != NULL && *var == '/') if (var != NULL && *var == '/')
return true; return true;
if (LogLevel > 12) if (LogLevel > 12)
sm_syslog(LOG_WARNING, NOQID, "STARTTLS: %s%s missing", sm_syslog(LOG_WARNING, NOQID, "STARTTLS: %s%s missing",
srv ? "Server" : "Client", fn); type == TLS_T_SRV ? "Server" :
(type == TLS_T_CLT ? "Client" : ""), var);
return false; return false;
} }
/* /*
@ -407,16 +413,16 @@ tls_safe_f(var, sff, srv)
** fn -- what is the filename used for? ** fn -- what is the filename used for?
** req -- is the file required? ** req -- is the file required?
** st -- status bit to set if ok ** st -- status bit to set if ok
** srv -- server side? ** type -- type of variable
** **
** Side Effects: ** Side Effects:
** uses r, ok; may change ok and status. ** uses r, ok; may change ok and status.
** **
*/ */
# define TLS_OK_F(var, fn, req, st, srv) if (ok) \ # define TLS_OK_F(var, fn, req, st, type) if (ok) \
{ \ { \
r = tls_ok_f(var, fn, srv); \ r = tls_ok_f(var, fn, type); \
if (r) \ if (r) \
status |= st; \ status |= st; \
else if (req) \ else if (req) \
@ -539,13 +545,13 @@ inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam)
*/ */
TLS_OK_F(certfile, "CertFile", bitset(TLS_I_CERT_EX, req), TLS_OK_F(certfile, "CertFile", bitset(TLS_I_CERT_EX, req),
TLS_S_CERT_EX, srv); TLS_S_CERT_EX, srv ? TLS_T_SRV : TLS_T_CLT);
TLS_OK_F(keyfile, "KeyFile", bitset(TLS_I_KEY_EX, req), TLS_OK_F(keyfile, "KeyFile", bitset(TLS_I_KEY_EX, req),
TLS_S_KEY_EX, srv); TLS_S_KEY_EX, srv ? TLS_T_SRV : TLS_T_CLT);
TLS_OK_F(cacertpath, "CACertPath", bitset(TLS_I_CERTP_EX, req), TLS_OK_F(cacertpath, "CACertPath", bitset(TLS_I_CERTP_EX, req),
TLS_S_CERTP_EX, srv); TLS_S_CERTP_EX, TLS_T_OTHER);
TLS_OK_F(cacertfile, "CACertFile", bitset(TLS_I_CERTF_EX, req), TLS_OK_F(cacertfile, "CACertFile", bitset(TLS_I_CERTF_EX, req),
TLS_S_CERTF_EX, srv); TLS_S_CERTF_EX, TLS_T_OTHER);
# if _FFR_TLS_1 # if _FFR_TLS_1
/* /*
@ -556,12 +562,12 @@ inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam)
if (cf2 != NULL) if (cf2 != NULL)
{ {
TLS_OK_F(cf2, "CertFile", bitset(TLS_I_CERT_EX, req), TLS_OK_F(cf2, "CertFile", bitset(TLS_I_CERT_EX, req),
TLS_S_CERT2_EX, srv); TLS_S_CERT2_EX, srv ? TLS_T_SRV : TLS_T_CLT);
} }
if (kf2 != NULL) if (kf2 != NULL)
{ {
TLS_OK_F(kf2, "KeyFile", bitset(TLS_I_KEY_EX, req), TLS_OK_F(kf2, "KeyFile", bitset(TLS_I_KEY_EX, req),
TLS_S_KEY2_EX, srv); TLS_S_KEY2_EX, srv ? TLS_T_SRV : TLS_T_CLT);
} }
# endif /* _FFR_TLS_1 */ # endif /* _FFR_TLS_1 */
@ -599,7 +605,7 @@ inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam)
{ {
TLS_OK_F(dhparam, "DHParameters", TLS_OK_F(dhparam, "DHParameters",
bitset(TLS_I_DHPAR_EX, req), bitset(TLS_I_DHPAR_EX, req),
TLS_S_DHPAR_EX, srv); TLS_S_DHPAR_EX, TLS_T_OTHER);
} }
} }
if (!ok) if (!ok)

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993 * Copyright (c) 1988, 1993
@ -13,7 +13,7 @@
#include <sendmail.h> #include <sendmail.h>
SM_RCSID("@(#)$Id: util.c,v 8.363.2.7 2003/06/02 03:25:39 gshapiro Exp $") SM_RCSID("@(#)$Id: util.c,v 8.363.2.10 2003/10/15 17:19:14 ca Exp $")
#include <sysexits.h> #include <sysexits.h>
#include <sm/xtrap.h> #include <sm/xtrap.h>
@ -2380,7 +2380,8 @@ str2prt(s)
*h++ = 'r'; *h++ = 'r';
break; break;
default: default:
(void) sm_snprintf(h, l, "%03o", (int) c); (void) sm_snprintf(h, l, "%03o",
(unsigned int)((unsigned char) c));
/* /*
** XXX since l is unsigned this may ** XXX since l is unsigned this may

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. * Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
* All rights reserved. * All rights reserved.
* Copyright (c) 1983 Eric P. Allman. All rights reserved. * Copyright (c) 1983 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993 * Copyright (c) 1988, 1993
@ -13,6 +13,6 @@
#include <sm/gen.h> #include <sm/gen.h>
SM_RCSID("@(#)$Id: version.c,v 8.104.2.22 2003/09/16 20:02:04 ca Exp $") SM_RCSID("@(#)$Id: version.c,v 8.104.2.26 2004/01/13 00:29:26 ca Exp $")
char Version[] = "8.12.10"; char Version[] = "8.12.11";