when reporting errors. Fix by Leandro Santi. Files:
global/mime_state.c, cleanup/cleanup_message.c.
+20060411
+
+ Bugfix: the SMTP server logged no warning when for some
+ reason the TLS engine was unavailable in wrappermode. Victor
+ Duchovni. File: smtpd/smtpd.c.
+
+20060417
+
+ Cleanup: when SMTP access table lookup fails, reply with
+ 4xx instead of aborting with a fatal run-time error. The
+ old behavior assumes local file access, and is inappropriate
+ with deployment of LDAP and SQL tables. File: smtpd/smtpd_check.c.
+
Wish list:
Don't send xforward attributes to every site that announces
lookup is disabled. Turning off name lookup reduces delays due to
DNS lookup and increases the maximal inbound delivery rate. </p>
+<p> This feature is available in Postfix 2.3 and later. </p>
+
</DD>
"unknown" when it cannot be looked up or verified, or when name
lookup is disabled. Turning off name lookup reduces delays due to
DNS lookup and increases the maximal inbound delivery rate.
+.PP
+This feature is available in Postfix 2.3 and later.
.SH smtpd_policy_service_max_idle (default: 300s)
The time after which an idle SMTPD policy service connection is
closed.
lookup is disabled. Turning off name lookup reduces delays due to
DNS lookup and increases the maximal inbound delivery rate. </p>
+<p> This feature is available in Postfix 2.3 and later. </p>
+
%PARAM delay_logging_resolution_limit 2
<p> The maximal number of digits after the decimal point when logging
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20060405"
+#define MAIL_RELEASE_DATE "20060418"
#define MAIL_VERSION_NUMBER "2.3"
#ifdef SNAPSHOT
*/
#ifdef USE_TLS
if (SMTPD_STAND_ALONE(state) == 0 && var_smtpd_tls_wrappermode) {
+ if (smtpd_tls_ctx == 0) {
+ msg_warn("Wrapper-mode request dropped from %s for service %s."
+ "TLS context initialization failed. For details see"
+ " earlier warnings in your logs.",
+ state->namaddr, state->service);
+ break;
+ }
if (var_smtpd_cntls_limit > 0
&& !xclient_allowed
&& anvil_clnt
CHK_ACCESS_RETURN(check_table_result(state, table, value, name,
reply_name, reply_class,
def_acl), FOUND);
- if (dict_errno != 0)
- msg_fatal("%s: table lookup problem", table);
+ if (dict_errno != 0) {
+ msg_warn("%s: table lookup problem", table);
+ value = "450 4.3.0 Server configuration error";
+ CHK_ACCESS_RETURN(check_table_result(state, table, value, name,
+ reply_name, reply_class,
+ def_acl), FOUND);
+ }
}
CHK_ACCESS_RETURN(SMTPD_CHECK_DUNNO, MISSED);
}
CHK_DOMAIN_RETURN(check_table_result(state, table, value,
domain, reply_name, reply_class,
def_acl), FOUND);
- if (dict_errno != 0)
- msg_fatal("%s: table lookup problem", table);
+ if (dict_errno != 0) {
+ msg_warn("%s: table lookup problem", table);
+ value = "450 4.3.0 Server configuration error";
+ CHK_DOMAIN_RETURN(check_table_result(state, table, value,
+ domain, reply_name, reply_class,
+ def_acl), FOUND);
+ }
}
/* Don't apply subdomain magic to numerical hostnames. */
if (maybe_numerical
CHK_ADDR_RETURN(check_table_result(state, table, value, address,
reply_name, reply_class,
def_acl), FOUND);
- if (dict_errno != 0)
- msg_fatal("%s: table lookup problem", table);
+ if (dict_errno != 0) {
+ msg_warn("%s: table lookup problem", table);
+ value = "450 4.3.0 Server configuration error";
+ CHK_ADDR_RETURN(check_table_result(state, table, value, address,
+ reply_name, reply_class,
+ def_acl), FOUND);
+ }
}
flags = PARTIAL;
} while (split_at_right(addr, delim));
/* #include <vstream.h>
/*
/* VSTREAM *vstream_fopen(path, flags, mode)
-/* char *path;
+/* const char *path;
/* int flags;
/* mode_t mode;
/*
/* VSTREAM *stream;
/*
/* VSTREAM *vstream_printf(format, ...)
-/* char *format;
+/* const char *format;
/*
/* VSTREAM *vstream_fprintf(stream, format, ...)
/* VSTREAM *stream;
-/* char *format;
+/* const char *format;
/*
/* int VSTREAM_GETC(stream)
/* VSTREAM *stream;
/* int ch;
/*
/* int vstream_fputs(str, stream)
-/* char *str;
+/* const char *str;
/* VSTREAM *stream;
/*
/* off_t vstream_ftell(stream)
/* int vstream_clearerr(stream)
/* VSTREAM *stream;
/*
-/* char *VSTREAM_PATH(stream)
+/* const char *VSTREAM_PATH(stream)
/* VSTREAM *stream;
/*
/* char *vstream_vfprintf(vp, format, ap)
-/* char *format;
+/* const char *format;
/* va_list *ap;
/*
/* ssize_t vstream_peek(stream)
#define vstream_feof(vp) vbuf_eof(&(vp)->buf)
#define vstream_ftimeout(vp) vbuf_timeout(&(vp)->buf)
#define vstream_clearerr(vp) vbuf_clearerr(&(vp)->buf)
-#define VSTREAM_PATH(vp) ((vp)->path ? (vp)->path : "unknown_stream")
+#define VSTREAM_PATH(vp) ((vp)->path ? (const char *) (vp)->path : "unknown_stream")
#define vstream_ftime(vp) ((time_t) ((vp)->iotime.tv_sec))
#define vstream_ftimeval(vp) ((vp)->iotime)
/* list of name, value, name, value, ... elements. By default only the
/* command search path is initialized to _PATH_DEFPATH.
/* .IP "VSTREAM_POPEN_EXPORT (char **)"
+/* This argument is passed to clean_env().
/* Null-terminated array of names of environment parameters
/* that can be exported. By default, everything is exported.
/* .IP "VSTREAM_POPEN_UID (uid_t)"