diff --git a/postfix/HISTORY b/postfix/HISTORY index dbebff361..dfaa4d8e5 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -12986,3 +12986,28 @@ Apologies for any names omitted. with deadlock, "postfix stop" forcefully stops all processes in the master's process group. Files: conf/postfix-script, master/master_sig.c. Back-ported from Postfix 2.4. + +20070425 + + Bugfix: don't falsely report "lost connection from + localhost[127.0.0.1]" when Postfix is being portscanned. + Files: smtpd/smtpd_peer.c, qmqpd/qmqpd_peer.c. + +20070430 + + Robustness: recommend a "0" process limit for policy servers + to avoid "connection refused" problems when the smtpd process + limit exceeds the default process limit. File: + proto/SMTPD_POLICY_README.html. + +20070501 + + Safety: when IPv6 (or IPv4) is turned off, don't treat an + IPv6 (or IPv4) connection from e.g. inetd as if it comes + from localhost[127.0.0.1]. Files: smtpd/smtpd_peer.c, + qmqpd/qmqpd_peer.c. + +20070508 + + Bugfix: Content-Transfer-Encoding: attribute values are + case insensitive. File: src/cleanup/cleanup_message.c. diff --git a/postfix/README_FILES/SMTPD_POLICY_README b/postfix/README_FILES/SMTPD_POLICY_README index 6ce119b84..65c9c111c 100644 --- a/postfix/README_FILES/SMTPD_POLICY_README +++ b/postfix/README_FILES/SMTPD_POLICY_README @@ -40,6 +40,7 @@ terminated by an empty line. Here is an example of all the attributes that the Postfix SMTP server sends in a delegated SMTPD access policy request: + PPoossttffiixx vveerrssiioonn 22..11 aanndd llaatteerr:: request=smtpd_access_policy protocol_state=RCPT protocol_name=SMTP @@ -167,7 +168,7 @@ To create a policy service that listens on a UNIX-domain socket called use something like this: 1 /etc/postfix/master.cf: - 2 policy unix - n n - - spawn + 2 policy unix - n n - 0 spawn 3 user=nobody argv=/some/where/policy-server 4 5 /etc/postfix/main.cf: @@ -187,13 +188,17 @@ NOTES: "policy_time_limit" setting. The name of the parameter is the name of the master.cf entry ("policy") concatenated with the "_time_limit" suffix. + * Line 2: specify a "0" process limit instead of the default "-", to avoid + "connection refused" and other problems when the smtpd process limit + exceeds the default_process_limit setting. + * Lines 8, 9: always specify "check_policy_service" AFTER "reject_unauth_destination" or else your system could become an open relay. * Solaris UNIX-domain sockets do not work reliably. Use TCP sockets instead: 1 /etc/postfix/master.cf: - 2 127.0.0.1:9998 inet n n n - - spawn + 2 127.0.0.1:9998 inet n n n - 0 spawn 3 user=nobody argv=/some/where/policy-server 4 5 /etc/postfix/main.cf: @@ -261,7 +266,7 @@ daemon. For example, to run the script as user "nobody", using a UNIX-domain socket that is accessible by Postfix processes only: 1 /etc/postfix/master.cf: - 2 policy unix - n n - - spawn + 2 policy unix - n n - 0 spawn 3 user=nobody argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl 4 5 /etc/postfix/main.cf: @@ -279,11 +284,15 @@ Notes: "policy_time_limit" setting. The name of the parameter is the name of the master.cf entry ("policy") concatenated with the "_time_limit" suffix. + * Line 2: specify a "0" process limit instead of the default "-", to avoid + "connection refused" and other problems when the smtpd process limit + exceeds the default_process_limit setting. + On Solaris you must use inet: style sockets instead of unix: style, as detailed in the "Policy client/server configuration" section above. 1 /etc/postfix/master.cf: - 2 127.0.0.1:9998 inet n n n - - spawn + 2 127.0.0.1:9998 inet n n n - 0 spawn 3 user=nobody argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl 4 5 /etc/postfix/main.cf: diff --git a/postfix/html/SMTPD_POLICY_README.html b/postfix/html/SMTPD_POLICY_README.html index 76f4cd8e6..cf662a28d 100644 --- a/postfix/html/SMTPD_POLICY_README.html +++ b/postfix/html/SMTPD_POLICY_README.html @@ -72,6 +72,7 @@ server sends in a delegated SMTPD access policy request:

+Postfix version 2.1 and later:
 request=smtpd_access_policy
 protocol_state=RCPT
 protocol_name=SMTP
@@ -238,7 +239,7 @@ daemon, you would use something like this: 

  1 /etc/postfix/master.cf:
- 2     policy  unix  -       n       n       -       -       spawn
+ 2     policy  unix  -       n       n       -       0       spawn
  3       user=nobody argv=/some/where/policy-server
  4 
  5 /etc/postfix/main.cf:
@@ -263,6 +264,10 @@ to an SMTP server process. The default time limit is overruled in
 the parameter is the name of the master.cf entry ("policy")
 concatenated with the "_time_limit" suffix.  

+
  • Line 2: specify a "0" process limit instead of the default +"-", to avoid "connection refused" and other problems when the smtpd +process limit exceeds the default_process_limit setting.

    +
  • Lines 8, 9: always specify "check_policy_service" AFTER "reject_unauth_destination" or else your system could become an open relay.

    @@ -275,7 +280,7 @@ TCP sockets instead:

      1 /etc/postfix/master.cf:
    - 2     127.0.0.1:9998  inet  n       n       n       -       -       spawn
    + 2     127.0.0.1:9998  inet  n       n       n       -       0       spawn
      3       user=nobody argv=/some/where/policy-server
      4 
      5 /etc/postfix/main.cf:
    @@ -367,7 +372,7 @@ processes only: 

     1 /etc/postfix/master.cf:
    -2     policy  unix  -       n       n       -       -       spawn
    +2     policy  unix  -       n       n       -       0       spawn
     3       user=nobody argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl
     4 
     5 /etc/postfix/main.cf:
    @@ -390,6 +395,10 @@ to an SMTP server process. The default time limit is overruled in
     the parameter is the name of the master.cf entry ("policy")
     concatenated with the "_time_limit" suffix.  

    +
  • Line 2: specify a "0" process limit instead of the default +"-", to avoid "connection refused" and other problems when the smtpd +process limit exceeds the default_process_limit setting.

    +

    On Solaris you must use inet: style sockets instead of unix: @@ -399,7 +408,7 @@ client/server configuration" section above.

     1 /etc/postfix/master.cf:
    -2     127.0.0.1:9998  inet  n       n       n       -       -       spawn
    +2     127.0.0.1:9998  inet  n       n       n       -       0       spawn
     3       user=nobody argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl
     4 
     5 /etc/postfix/main.cf:
    diff --git a/postfix/html/postconf.1.html b/postfix/html/postconf.1.html
    index 02eef4281..0640384da 100644
    --- a/postfix/html/postconf.1.html
    +++ b/postfix/html/postconf.1.html
    @@ -177,8 +177,8 @@ POSTCONF(1)                                                        POSTCONF(1)
                   tcp (read-only)
                          Perform lookups using a simple request-reply
                          protocol that is described in  tcp_table(5).
    -                     This  feature  is  not included with Postfix
    -                     2.2.
    +                     This feature is not included with the stable
    +                     Postfix release.
     
                   unix (read-only)
                          A limited way to query the UNIX  authentica-
    diff --git a/postfix/man/man1/postconf.1 b/postfix/man/man1/postconf.1
    index f53403163..c0fed1ae4 100644
    --- a/postfix/man/man1/postconf.1
    +++ b/postfix/man/man1/postconf.1
    @@ -152,7 +152,7 @@ result.
     .IP "\fBtcp\fR (read-only)"
     Perform lookups using a simple request-reply protocol that is
     described in \fBtcp_table\fR(5).
    -This feature is not included with Postfix 2.2.
    +This feature is not included with the stable Postfix release.
     .IP "\fBunix\fR (read-only)"
     A limited way to query the UNIX authentication database. The
     following tables are implemented:
    diff --git a/postfix/proto/SMTPD_POLICY_README.html b/postfix/proto/SMTPD_POLICY_README.html
    index 6030d6183..a53c4d237 100644
    --- a/postfix/proto/SMTPD_POLICY_README.html
    +++ b/postfix/proto/SMTPD_POLICY_README.html
    @@ -72,6 +72,7 @@ server sends in a delegated SMTPD access policy request: 

    +Postfix version 2.1 and later:
     request=smtpd_access_policy
     protocol_state=RCPT
     protocol_name=SMTP
    @@ -238,7 +239,7 @@ daemon, you would use something like this: 

      1 /etc/postfix/master.cf:
    - 2     policy  unix  -       n       n       -       -       spawn
    + 2     policy  unix  -       n       n       -       0       spawn
      3       user=nobody argv=/some/where/policy-server
      4 
      5 /etc/postfix/main.cf:
    @@ -263,6 +264,10 @@ main.cf with an explicit "policy_time_limit" setting.  The name of
     the parameter is the name of the master.cf entry ("policy")
     concatenated with the "_time_limit" suffix.  

    +
  • Line 2: specify a "0" process limit instead of the default +"-", to avoid "connection refused" and other problems when the smtpd +process limit exceeds the default_process_limit setting.

    +
  • Lines 8, 9: always specify "check_policy_service" AFTER "reject_unauth_destination" or else your system could become an open relay.

    @@ -275,7 +280,7 @@ TCP sockets instead:

      1 /etc/postfix/master.cf:
    - 2     127.0.0.1:9998  inet  n       n       n       -       -       spawn
    + 2     127.0.0.1:9998  inet  n       n       n       -       0       spawn
      3       user=nobody argv=/some/where/policy-server
      4 
      5 /etc/postfix/main.cf:
    @@ -367,7 +372,7 @@ processes only: 

     1 /etc/postfix/master.cf:
    -2     policy  unix  -       n       n       -       -       spawn
    +2     policy  unix  -       n       n       -       0       spawn
     3       user=nobody argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl
     4 
     5 /etc/postfix/main.cf:
    @@ -390,6 +395,10 @@ main.cf with an explicit "policy_time_limit" setting.  The name of
     the parameter is the name of the master.cf entry ("policy")
     concatenated with the "_time_limit" suffix.  

    +
  • Line 2: specify a "0" process limit instead of the default +"-", to avoid "connection refused" and other problems when the smtpd +process limit exceeds the default_process_limit setting.

    +

    On Solaris you must use inet: style sockets instead of unix: @@ -399,7 +408,7 @@ client/server configuration" section above.

     1 /etc/postfix/master.cf:
    -2     127.0.0.1:9998  inet  n       n       n       -       -       spawn
    +2     127.0.0.1:9998  inet  n       n       n       -       0       spawn
     3       user=nobody argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl
     4 
     5 /etc/postfix/main.cf:
    diff --git a/postfix/src/cleanup/cleanup_message.c b/postfix/src/cleanup/cleanup_message.c
    index 5e71c8b89..00e2d6d1a 100644
    --- a/postfix/src/cleanup/cleanup_message.c
    +++ b/postfix/src/cleanup/cleanup_message.c
    @@ -515,7 +515,7 @@ static void cleanup_header_callback(void *context, int header_class,
         if (hdr_opts->type == HDR_CONTENT_TRANSFER_ENCODING) {
     	for (cmp = code_map; cmp->name != 0; cmp++) {
     	    if (strcasecmp(hdrval, cmp->name) == 0) {
    -		if (strcmp(cmp->encoding, MAIL_ATTR_ENC_8BIT) == 0)
    +		if (strcasecmp(cmp->encoding, MAIL_ATTR_ENC_8BIT) == 0)
     		    nvtable_update(state->attr, MAIL_ATTR_ENCODING,
     				   cmp->encoding);
     		break;
    diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h
    index 50054d400..6f9f64174 100644
    --- a/postfix/src/global/mail_version.h
    +++ b/postfix/src/global/mail_version.h
    @@ -20,8 +20,8 @@
       * Patches change both the patchlevel and the release date. Snapshots have no
       * patchlevel; they change the release date only.
       */
    -#define MAIL_RELEASE_DATE	"20070423"
    -#define MAIL_VERSION_NUMBER	"2.3.9"
    +#define MAIL_RELEASE_DATE	"20070511"
    +#define MAIL_VERSION_NUMBER	"2.3.10-RC1"
     
     #ifdef SNAPSHOT
     # define MAIL_VERSION_DATE	"-" MAIL_RELEASE_DATE
    diff --git a/postfix/src/postconf/postconf.c b/postfix/src/postconf/postconf.c
    index 376644fe9..3bf12da55 100644
    --- a/postfix/src/postconf/postconf.c
    +++ b/postfix/src/postconf/postconf.c
    @@ -146,7 +146,7 @@
     /* .IP "\fBtcp\fR (read-only)"
     /*	Perform lookups using a simple request-reply protocol that is
     /*	described in \fBtcp_table\fR(5).
    -/*	This feature is not included with Postfix 2.2.
    +/*	This feature is not included with the stable Postfix release.
     /* .IP "\fBunix\fR (read-only)"
     /*	A limited way to query the UNIX authentication database. The
     /*	following tables are implemented:
    diff --git a/postfix/src/qmqpd/qmqpd_peer.c b/postfix/src/qmqpd/qmqpd_peer.c
    index 9d084e56d..f97a52452 100644
    --- a/postfix/src/qmqpd/qmqpd_peer.c
    +++ b/postfix/src/qmqpd/qmqpd_peer.c
    @@ -91,7 +91,7 @@ void    qmqpd_peer_init(QMQPD_STATE *state)
         /*
          * If peer went away, give up.
          */
    -    if (errno == ECONNRESET || errno == ECONNABORTED) {
    +    if (errno != 0 && errno != ENOTSOCK) {
     	state->name = mystrdup(CLIENT_NAME_UNKNOWN);
     	state->addr = mystrdup(CLIENT_ADDR_UNKNOWN);
     	state->rfc_addr = mystrdup(CLIENT_ADDR_UNKNOWN);
    @@ -100,14 +100,32 @@ void    qmqpd_peer_init(QMQPD_STATE *state)
     
         /*
          * Convert the client address to printable address and hostname.
    +     * 
    +     * XXX If we're given an IPv6 (or IPv4) connection from, e.g., inetd, while
    +     * Postfix IPv6 (or IPv4) support is turned off, don't (skip to the final
    +     * else clause, pretend the origin is localhost[127.0.0.1], and become an
    +     * open relay).
          */
         else if (errno == 0
    -	     && strchr((char *) proto_info->sa_family_list, sa->sa_family)) {
    +	     && (sa->sa_family == AF_INET
    +#ifdef AF_INET6
    +		 || sa->sa_family == AF_INET6
    +#endif
    +		 )) {
     	MAI_HOSTNAME_STR client_name;
     	MAI_HOSTADDR_STR client_addr;
     	int     aierr;
     	char   *colonp;
     
    +	/*
    +	 * Sanity check: we can't use sockets that we're not configured for.
    +	 */
    +	if (strchr((char *) proto_info->sa_family_list, sa->sa_family) == 0)
    +	    msg_fatal("cannot handle socket type %s with \"%s = %s\"",
    +		      sa->sa_family == AF_INET6 ? "AF_INET6" :
    +		      sa->sa_family == AF_INET ? "AF_INET" :
    +		      "other", VAR_INET_PROTOCOLS, var_inet_protocols);
    +
     	/*
     	 * Sorry, but there are some things that we just cannot do while
     	 * connected to the network.
    diff --git a/postfix/src/smtpd/smtpd_peer.c b/postfix/src/smtpd/smtpd_peer.c
    index 8dacecffb..e61e8233e 100644
    --- a/postfix/src/smtpd/smtpd_peer.c
    +++ b/postfix/src/smtpd/smtpd_peer.c
    @@ -155,7 +155,7 @@ void    smtpd_peer_init(SMTPD_STATE *state)
         /*
          * If peer went away, give up.
          */
    -    if (errno == ECONNRESET || errno == ECONNABORTED) {
    +    if (errno != 0 && errno != ENOTSOCK) {
     	state->name = mystrdup(CLIENT_NAME_UNKNOWN);
     	state->reverse_name = mystrdup(CLIENT_NAME_UNKNOWN);
     	state->addr = mystrdup(CLIENT_ADDR_UNKNOWN);
    @@ -167,14 +167,32 @@ void    smtpd_peer_init(SMTPD_STATE *state)
     
         /*
          * Convert the client address to printable address and hostname.
    +     * 
    +     * XXX If we're given an IPv6 (or IPv4) connection from, e.g., inetd, while
    +     * Postfix IPv6 (or IPv4) support is turned off, don't (skip to the final
    +     * else clause, pretend the origin is localhost[127.0.0.1], and become an
    +     * open relay).
          */
         else if (errno == 0
    -	     && strchr((char *) proto_info->sa_family_list, sa->sa_family)) {
    +	     && (sa->sa_family == AF_INET
    +#ifdef AF_INET6
    +		 || sa->sa_family == AF_INET6
    +#endif
    +		 )) {
     	MAI_HOSTNAME_STR client_name;
     	MAI_HOSTADDR_STR client_addr;
     	int     aierr;
     	char   *colonp;
     
    +	/*
    +	 * Sanity check: we can't use sockets that we're not configured for.
    +	 */
    +	if (strchr((char *) proto_info->sa_family_list, sa->sa_family) == 0)
    +	    msg_fatal("cannot handle socket type %s with \"%s = %s\"",
    +		      sa->sa_family == AF_INET6 ? "AF_INET6" :
    +		      sa->sa_family == AF_INET ? "AF_INET" :
    +		      "other", VAR_INET_PROTOCOLS, var_inet_protocols);
    +
     	/*
     	 * Sorry, but there are some things that we just cannot do while
     	 * connected to the network.