keys. Problem reported by Andrei Koulik. Files:
util/match_ops.c, src/trivial-rewrite/transport.c.
+20040401
+
+ Bugfix: the MySQL client aborted because of a spurious
+ dict_register() call, causing complaints about a table
+ already being registered. File: util/dict_mysql.c.
+
+20040407
+
+ Bugfix: missing return statement at the end of the
+ FREE_MEMORY_AND_RETURN error handling macro. This could
+ cause core dump after table lookup failure. Adi Prasaja.
+ File: trivial-rewrite/resolve.c.
+
+20040414
+
+ Bugfix: postdrop should not enable SIGHUP (and abort mail
+ delivery) when SIGHUP was ignored by the parent process.
+ File: postdrop/postdrop.c. Victor Duchovni, Morgan Stanley.
+
+
+20040415
+
+ Bugfix: the LMTP client attempted to reuse a connection
+ after timeout, causing protocol synchronization errors.
+ Reported by Rob Mueller. File: lmtp/lmtp.c.
+
+20040421
+
+ Workaround: allow pipelined SMTP clients to overshoot the
+ SMTP server recipient limit without triggering the server
+ hard error limit. The SMTP server does not count "too many
+ recipients" towards the hard error limit, as long as the
+ number of excess recipients stays within a hard-coded
+ overshoot limit of 1000. Based on a Postfix 2.1 solution
+ that was developed in cooperation with Victor Duchovni.
+ Files: smtpd/smtpd.c, smtpd/smtpd_state.c, smtpd/smtpd.h.
+
Open problems:
Doc: mention the proxy_interfaces parameter everywhere the
Options:
- <b>-c</b> The <b>main.cf</b> configuration file is in the named
+ <b>-c</b> <i>config_dir</i>
+ The <b>main.cf</b> configuration file is in the named
directory instead of the default configuration
directory. See also the MAIL_CONFIG environment
setting below.
directory and copies its standard input to the file.
Options:
-.IP \fB-c \fIconfig_dir\fR
+.IP "\fB-c \fIconfig_dir\fR"
The \fBmain.cf\fR configuration file is in the named directory
instead of the default configuration directory. See also the
MAIL_CONFIG environment setting below.
* Patches change the patchlevel and the release date. Snapshots change the
* release date only, unless they include the same bugfix as a patch release.
*/
-#define MAIL_RELEASE_DATE "20040312"
+#define MAIL_RELEASE_DATE "20040422"
#define VAR_MAIL_VERSION "mail_version"
-#define DEF_MAIL_VERSION "2.0.19"
+#define DEF_MAIL_VERSION "2.0.20"
extern char *var_mail_version;
/*
lmtp_chat_notify(state);
/*
- * Disconnect if we're not cacheing connections. The pipelined protocol
- * state machine knows if it should have sent a QUIT command.
+ * Disconnect if we're not caching connections. The pipelined protocol
+ * state machine knows if it should have sent a QUIT command. Do not
+ * cache a broken connection.
*/
- if (state->session != 0 && !var_lmtp_cache_conn)
+ if (state->session != 0
+ && (!var_lmtp_cache_conn
+ || vstream_ferror(state->session->stream)
+ || vstream_feof(state->session->stream)))
state->session = lmtp_session_free(state->session);
/*
/* directory and copies its standard input to the file.
/*
/* Options:
-/* .IP \fB-c \fIconfig_dir\fR
+/* .IP "\fB-c \fIconfig_dir\fR"
/* The \fBmain.cf\fR configuration file is in the named directory
/* instead of the default configuration directory. See also the
/* MAIL_CONFIG environment setting below.
signal(SIGPIPE, SIG_IGN);
signal(SIGXFSZ, SIG_IGN);
- signal(SIGHUP, postdrop_sig);
+ if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
+ signal(SIGHUP, postdrop_sig);
signal(SIGINT, postdrop_sig);
signal(SIGQUIT, postdrop_sig);
signal(SIGTERM, postdrop_sig);
}
}
if (var_smtpd_rcpt_limit && state->rcpt_count >= var_smtpd_rcpt_limit) {
- state->error_mask |= MAIL_ERROR_POLICY;
smtpd_chat_reply(state, "452 Error: too many recipients");
+ /* XXX Turning off the error sleep involves too invasive changes. */
+ if (state->rcpt_overshoot++ < 1000)
+ return (0);
+ state->error_mask |= MAIL_ERROR_POLICY;
return (-1);
}
if (SMTPD_STAND_ALONE(state) == 0) {
state->recipient = 0;
}
state->rcpt_count = 0;
+ /* XXX Must flush the command history. */
+ state->rcpt_overshoot = 0;
}
/* data_cmd - process DATA command */
int recursion;
off_t msg_size;
int junk_cmds;
+ int rcpt_overshoot;
#ifdef USE_SASL_AUTH
#if SASL_VERSION_MAJOR >= 2
const char *sasl_mechanism_list;
state->recursion = 0;
state->msg_size = 0;
state->junk_cmds = 0;
+ state->rcpt_overshoot = 0;
state->defer_if_permit_client = 0;
state->defer_if_permit_helo = 0;
state->defer_if_permit_sender = 0;
tok822_free_tree(tree); \
if (addr_buf) \
vstring_free(addr_buf); \
+ return; \
}
/*
dict_mysql->name->len_hosts);
if (dict_mysql->pldb == NULL)
msg_fatal("couldn't intialize pldb!\n");
- dict_register(name, (DICT *) dict_mysql);
return (DICT_DEBUG (&dict_mysql->dict));
}