2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-30 13:48:06 +00:00

postfix-2.9-20111117

This commit is contained in:
Wietse Venema
2011-11-17 00:00:00 -05:00
committed by Viktor Dukhovni
parent 3e2c27fd00
commit 43e8a20e21
17 changed files with 179 additions and 115 deletions

4
postfix/.indent.pro vendored
View File

@@ -97,6 +97,7 @@
-TDICT_REGEXP_RULE
-TDICT_SDBM
-TDICT_SQLITE
-TDICT_STACK
-TDICT_TCP
-TDICT_TEXT
-TDICT_UNIX
@@ -185,6 +186,8 @@
-TNAME_CODE
-TNAME_MASK
-TNBBIO
-TPC_SERVICE_DEF
-TPC_STRING_NV
-TPEER_NAME
-TPGSQL_NAME
-TPICKUP_INFO
@@ -266,7 +269,6 @@
-TSSL_CTX
-TSSL_SESSION
-TSTRING_LIST
-TSTRING_NV
-TSTRING_TABLE
-TSYS_EXITS_DETAIL
-TTLSMGR_SCACHE

View File

@@ -17075,3 +17075,20 @@ Apologies for any names omitted.
Cleanup: documented the postconf algorithms and their
limitations, and added regression tests to speed up future
development. File: postconf/postconf.c
20111117
Cleanup: postconf didn't "bless" type "inet" service names.
Cleanup: with pipelined sessions, smtp-sink flushed the
output too often. Reported by Mark Martinec. File:
smtpstone/smtp-sink.c.
Workaround: don't use IPv6 at build time. File: conf/main.cf.
Workaround: don't abort when IPv6 is present but busted.
File: util/inet_proto.c.
Portability: Dovecot now officially supports more socket
types for its authentication server. File:
xsasl/xsasl_dovecot_server.c.

View File

@@ -654,3 +654,4 @@ sample_directory =
# readme_directory: The location of the Postfix README files.
#
readme_directory =
inet_protocols = ipv4

View File

@@ -186,7 +186,7 @@ MASTER(8) MASTER(8)
<a href="qmgr.8.html">qmgr(8)</a>, queue manager
<a href="verify.8.html">verify(8)</a>, address verification
<a href="master.5.html">master(5)</a>, <a href="master.5.html">master.cf</a> configuration file syntax
<a href="postconf.5.html">postconf(5)</a>, <a href="postconf.5.html">main.cf</a> configuration parameter syntax
<a href="postconf.5.html">postconf(5)</a>, <a href="postconf.5.html">main.cf</a> configuration file syntax
syslogd(8), system logging
<b>LICENSE</b>

View File

@@ -270,10 +270,10 @@ POSTCONF(1) POSTCONF(1)
Problems are reported to the standard error stream.
<b>BUGS</b>
There currently is no support for per-service parameter
name spaces in <a href="master.5.html">master.cf</a>. This means that "-o user-
defined-name=value" always results in an "unused parame-
ter" warning.
<a href="postconf.1.html"><b>postconf</b>(1)</a> may log "unused parameter" warnings for <b>mas-</b>
<b>ter.cf</b> entries with "-o user-defined-name=value".
Addressing this limitation requires support for per-ser-
vice parameter name spaces.
<b>ENVIRONMENT</b>
<b>MAIL_CONFIG</b>
@@ -299,7 +299,8 @@ POSTCONF(1) POSTCONF(1)
<b>SEE ALSO</b>
<a href="bounce.5.html">bounce(5)</a>, bounce template file format
<a href="postconf.5.html">postconf(5)</a>, configuration parameters
<a href="master.5.html">master(5)</a>, <a href="master.5.html">master.cf</a> configuration file syntax
<a href="postconf.5.html">postconf(5)</a>, <a href="postconf.5.html">main.cf</a> configuration file syntax
<b>README FILES</b>
<a href="DATABASE_README.html">DATABASE_README</a>, Postfix lookup table overview

View File

@@ -229,10 +229,10 @@ Problems are reported to the standard error stream.
.SH BUGS
.ad
.fi
There currently is no support for per-service parameter
name spaces in master.cf. This means that "-o
user-defined-name=value" always results in an "unused
parameter" warning.
\fBpostconf\fR(1) may log "unused parameter" warnings for
\fBmaster.cf\fR entries with "-o user-defined-name=value".
Addressing this limitation requires support for per-service
parameter name spaces.
.SH "ENVIRONMENT"
.na
.nf
@@ -263,7 +263,8 @@ Pathname of a configuration file with bounce message templates.
.na
.nf
bounce(5), bounce template file format
postconf(5), configuration parameters
master(5), master.cf configuration file syntax
postconf(5), main.cf configuration file syntax
.SH "README FILES"
.na
.nf

View File

@@ -170,7 +170,7 @@ $data_directory/master.lock, master lock file.
qmgr(8), queue manager
verify(8), address verification
master(5), master.cf configuration file syntax
postconf(5), main.cf configuration parameter syntax
postconf(5), main.cf configuration file syntax
syslogd(8), system logging
.SH "LICENSE"
.na

View File

@@ -20,7 +20,7 @@
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
#define MAIL_RELEASE_DATE "20111113"
#define MAIL_RELEASE_DATE "20111117"
#define MAIL_VERSION_NUMBER "2.9"
#ifdef SNAPSHOT

View File

@@ -150,7 +150,7 @@
/* qmgr(8), queue manager
/* verify(8), address verification
/* master(5), master.cf configuration file syntax
/* postconf(5), main.cf configuration parameter syntax
/* postconf(5), main.cf configuration file syntax
/* syslogd(8), system logging
/* LICENSE
/* .ad

View File

@@ -36,7 +36,7 @@ Makefile: Makefile.in
test: $(TESTPROG)
tests: test1 test2 test3 test4 test5
tests: test1 test2 test3 test4 test5 test6 test7 test8
root_tests:
@@ -79,7 +79,6 @@ test2: $(PROG) test2.ref
test3: $(PROG) test3.ref
rm -f main.cf master.cf
touch main.cf master.cf
./$(PROG) -nc . >test_base.tmp 2>&1
echo foo = yes >> main.cf
echo 'bar = $$foo' >> main.cf
echo 'always_bcc = $$bar' >> main.cf
@@ -92,10 +91,9 @@ test3: $(PROG) test3.ref
test4: $(PROG) test4.ref
rm -f main.cf master.cf
touch main.cf master.cf
./$(PROG) -nc . >test_base.tmp 2>&1
echo foo = yes >> main.cf
echo 'bar = $$foo' >> main.cf
echo smtpd 1 2 3 4 5 6 7 >> master.cf
echo smtpd unix - n n - 0 smtpd >> master.cf
echo ' -o always_bcc=$$bar' >> master.cf
./$(PROG) -nc . >test4.tmp 2>&1
diff test4.ref test4.tmp
@@ -109,13 +107,41 @@ test4: $(PROG) test4.ref
test5: $(PROG) test5.ref
rm -f main.cf master.cf
touch main.cf master.cf
./$(PROG) -nc . >test_base.tmp 2>&1
echo smtpd 1 2 3 4 5 6 7 >> master.cf
echo smtpd unix - n n - 0 smtpd >> master.cf
echo ' -o bar=yes -o always_bcc=$$bar -o' >> master.cf
./$(PROG) -nc . >test5.tmp 2>&1
diff test5.ref test5.tmp
rm -f main.cf master.cf test5.tmp
# Basic functionality test: service parameters for delivery agents.
test6: $(PROG) test6.ref
rm -f main.cf master.cf
touch main.cf master.cf
echo whatevershebrings unix - n n - 0 pipe >> master.cf
./$(PROG) -c . 2>&1 | grep whatevershebrings >test6.tmp
diff test6.ref test6.tmp
rm -f main.cf master.cf test6.tmp
# Basic functionality test: service parameters for spawn programs.
test7: $(PROG) test7.ref
rm -f main.cf master.cf
touch main.cf master.cf
echo whatevershebrings unix - n n - 0 spawn >> master.cf
./$(PROG) -c . 2>&1 | grep whatevershebrings >test7.tmp
diff test7.ref test7.tmp
rm -f main.cf master.cf test7.tmp
test8: $(PROG) test8.ref
rm -f main.cf master.cf
touch main.cf master.cf
echo whatevershebrings inet - n n - 0 spawn >> master.cf
echo whatevershebrings_time_limit=1 >> main.cf
./$(PROG) -c . 2>&1 | grep whatevershebrings >test8.tmp
diff test8.ref test8.tmp
rm -f main.cf master.cf test8.tmp
printfck: $(OBJS) $(PROG)
rm -rf printfck
mkdir printfck
@@ -152,6 +178,8 @@ postconf.o: ../../include/get_hostname.h
postconf.o: ../../include/htable.h
postconf.o: ../../include/inet_proto.h
postconf.o: ../../include/iostuff.h
postconf.o: ../../include/mac_expand.h
postconf.o: ../../include/mac_parse.h
postconf.o: ../../include/mail_addr.h
postconf.o: ../../include/mail_conf.h
postconf.o: ../../include/mail_dict.h

View File

@@ -219,10 +219,10 @@
/* DIAGNOSTICS
/* Problems are reported to the standard error stream.
/* BUGS
/* There currently is no support for per-service parameter
/* name spaces in master.cf. This means that "-o
/* user-defined-name=value" always results in an "unused
/* parameter" warning.
/* \fBpostconf\fR(1) may log "unused parameter" warnings for
/* \fBmaster.cf\fR entries with "-o user-defined-name=value".
/* Addressing this limitation requires support for per-service
/* parameter name spaces.
/* ENVIRONMENT
/* .ad
/* .fi
@@ -245,7 +245,8 @@
/* /etc/postfix/main.cf, Postfix configuration parameters
/* SEE ALSO
/* bounce(5), bounce template file format
/* postconf(5), configuration parameters
/* master(5), master.cf configuration file syntax
/* postconf(5), main.cf configuration file syntax
/* README FILES
/* .ad
/* .fi
@@ -349,7 +350,7 @@ HTABLE *param_table;
* Lookup table for master.cf info.
*
* XXX Replace by data structures with per-entry hashes for "-o name=value", so
* that we can properly handle of definitions and uses in per-service name
* that we can properly handle name=value definitions in per-service name
* spaces.
*/
static ARGV **master_table;
@@ -423,14 +424,14 @@ static const CONFIG_LONG_TABLE long_table[] = {
typedef struct {
const char *name;
const char *value;
} STRING_NV;
} PC_STRING_NV;
/*
* Service-defined parameter names are created by appending postfix-defined
* suffixes to master.cf service names. These parameters have default values
* that are defined by built-in parameters.
*/
static STRING_NV *serv_param_table;
static PC_STRING_NV *serv_param_table;
static ssize_t serv_param_tablen;
/*
@@ -767,8 +768,13 @@ static void set_parameters(void)
{
/*
* Populate the configuration parameter dictionary with default settings
* or with actual settings.
* The proposal below describes some of the steps needed to expand
* parameter values. It has a problem: it updates the configuration
* parameter dictionary, and in doing so breaks the "postconf -d"
* implementation.
*
* Populate the configuration parameter dictionary with default settings or
* with actual settings.
*
* Iterate over each entry in str_fn_table, str_fn_table_2, time_table,
* bool_table, int_table, str_table, and raw_table. Look up each
@@ -856,7 +862,7 @@ static void read_master(void)
static void add_service_parameter(const char *service, const char *suffix,
const char *defparam)
{
STRING_NV *sp;
PC_STRING_NV *sp;
char *name = concatenate(service, suffix, (char *) 0);
/*
@@ -867,11 +873,11 @@ static void add_service_parameter(const char *service, const char *suffix,
if (htable_locate(param_table, name) != 0) {
myfree(name);
} else {
serv_param_table = (STRING_NV *)
serv_param_table = (PC_STRING_NV *)
myrealloc((char *) serv_param_table,
(serv_param_tablen + 1) * sizeof(*serv_param_table));
sp = serv_param_table + serv_param_tablen;
sp->name = concatenate(service, suffix, (char *) 0);
sp->name = name;
sp->value = defparam;
serv_param_tablen += 1;
}
@@ -881,14 +887,7 @@ static void add_service_parameter(const char *service, const char *suffix,
static void add_service_parameters(void)
{
/* XXX Should this list be configurable? */
static const char *delivery_agents[] = {
MAIL_PROGRAM_LOCAL, MAIL_PROGRAM_ERROR,
MAIL_PROGRAM_VIRTUAL, MAIL_PROGRAM_SMTP,
MAIL_PROGRAM_LMTP, MAIL_PROGRAM_PIPE,
0,
};
static const STRING_NV service_params[] = {
static const PC_STRING_NV service_params[] = {
/* suffix, default parameter name */
_XPORT_RCPT_LIMIT, VAR_XPORT_RCPT_LIMIT,
_STACK_RCPT_LIMIT, VAR_STACK_RCPT_LIMIT,
@@ -907,22 +906,36 @@ static void add_service_parameters(void)
_DEST_RATE_DELAY, VAR_DEST_RATE_DELAY,
0,
};
static const STRING_NV spawn_params[] = {
static const PC_STRING_NV spawn_params[] = {
/* suffix, default parameter name */
_MAXTIME, VAR_COMMAND_MAXTIME,
0,
};
const STRING_NV *sp;
typedef struct {
const char *progname;
const PC_STRING_NV *params;
} PC_SERVICE_DEF;
static const PC_SERVICE_DEF service_defs[] = {
MAIL_PROGRAM_LOCAL, service_params,
MAIL_PROGRAM_ERROR, service_params,
MAIL_PROGRAM_VIRTUAL, service_params,
MAIL_PROGRAM_SMTP, service_params,
MAIL_PROGRAM_LMTP, service_params,
MAIL_PROGRAM_PIPE, service_params,
MAIL_PROGRAM_SPAWN, spawn_params,
0,
};
const PC_STRING_NV *sp;
const char *progname;
const char *service;
ARGV **argvp;
ARGV *argv;
const char **cpp;
const PC_SERVICE_DEF *sd;
/*
* Initialize the table with service parameter names and defaults.
*/
serv_param_table = (STRING_NV *) mymalloc(1);
serv_param_table = (PC_STRING_NV *) mymalloc(1);
serv_param_tablen = 0;
/*
@@ -932,33 +945,17 @@ static void add_service_parameters(void)
for (argvp = master_table; (argv = *argvp) != 0; argvp++) {
/*
* Skip all endpoints except UNIX-domain sockets.
*/
if (strcmp(argv->argv[1], MASTER_XPORT_NAME_UNIX) != 0)
continue;
/*
* Add service parameters for message delivery transports.
* Add service parameters for message delivery transports or spawn
* programs.
*/
progname = argv->argv[7];
for (cpp = delivery_agents; *cpp; cpp++)
if (strcmp(*cpp, progname) == 0)
for (sd = service_defs; sd->progname; sd++) {
if (strcmp(sd->progname, progname) == 0) {
service = argv->argv[0];
for (sp = sd->params; sp->name; sp++)
add_service_parameter(service, sp->name, sp->value);
break;
if (*cpp != 0) {
service = argv->argv[0];
for (sp = service_params; sp->name; sp++)
add_service_parameter(service, sp->name, sp->value);
continue;
}
/*
* Add service parameters for spawn(8)-based services.
*/
if (strcmp(MAIL_PROGRAM_SPAWN, progname) == 0) {
service = argv->argv[0];
for (sp = spawn_params; sp->name; sp++)
add_service_parameter(service, sp->name, sp->value);
continue;
}
}
}
@@ -1056,9 +1053,9 @@ static void add_user_parameters(void)
* but only if they have a "name=value" entry in main.cf.
*
* XXX It is possible that a user-defined parameter is defined in master.cf
* with "-o smtpd_restriction_classes=name -o name=value". To handle this
* we need to give each master.cf entry its own name space. Until then,
* we may log false warnings for unused "-o name=value" entries.
* with "-o smtpd_restriction_classes=name -o name=value". This requires
* name space support for master.cf entries. Without this, we always log
* "unused parameter" warnings for "-o user-defined-name=value" entries.
*/
if ((class_list = mail_conf_lookup_eval(VAR_REST_CLASSES)) != 0) {
cp = saved_class_list = mystrdup(class_list);
@@ -1070,8 +1067,9 @@ static void add_user_parameters(void)
/*
* Parse the "name=value" instances in main.cf of built-in and service
* parameters only, look for macro expansions of unknown parameter names,
* and flag those unknown parameter names as "known" if they have a
* "name=value" entry in main.cf.
* and flag those parameter names as "known" if they have a "name=value"
* entry in main.cf. Recursively apply the procedure to the values of
* newly-flagged parameters.
*/
for (ht_info = ht = htable_list(param_table); *ht; ht++)
if ((cparam_value = mail_conf_lookup(ht[0]->key)) != 0)
@@ -1079,16 +1077,11 @@ static void add_user_parameters(void)
myfree((char *) ht_info);
/*
* Parse all "-o parameter=value" instances in master.cf, look for for
* macro expansions of unknown parameter names, and flag those unknown
* parameter names as "known" if they have a "name=value" entry in
* main.cf.
*
* XXX It is possible that a user-defined parameter is defined in master.cf
* with "-o name1=value1" and then used in a "-o name2=$name1" macro
* expansion in that same master.cf entry. To handle this we need to give
* each master.cf entry its own name space. Until then, we may log false
* warnings for unused "-o name=value" entries.
* Parse all "-o parameter=value" instances in master.cf, look for macro
* expansions of unknown parameter names, and flag those parameter names
* as "known" if they have a "name=value" entry in main.cf (XXX todo: in
* master.cf; without master.cf name space support we always log "unused
* parameter" warnings for "-o user-defined-name=value" entries).
*/
for (argvp = master_table; (argv = *argvp) != 0; argvp++) {
for (field = MASTER_FIELD_COUNT; argv->argv[field] != 0; field++) {
@@ -1505,7 +1498,7 @@ static void print_service_param_default(int mode, const char *name,
/* print_service_param - show service parameter */
static void print_service_param(int mode, const char *name,
const STRING_NV *dst)
const PC_STRING_NV *dst)
{
const char *value;
@@ -1581,7 +1574,7 @@ static void print_parameter(int mode, const char *name, char *ptr)
if (INSIDE(ptr, long_table))
print_long(mode, name, (CONFIG_LONG_TABLE *) ptr);
if (INSIDE3(ptr, serv_param_table, serv_param_tablen))
print_service_param(mode, name, (STRING_NV *) ptr);
print_service_param(mode, name, (PC_STRING_NV *) ptr);
if (INSIDE3(ptr, user_param_table, user_param_tablen))
print_user_param(mode, name);
if (msg_verbose)
@@ -1824,8 +1817,8 @@ static void flag_unused_master_parameters(void)
* with "-o smtpd_restriction_classes=name", or with "-o name1=value1"
* and then used in a "-o name2=$name1" macro expansion in that same
* master.cf entry. To handle this we need to give each master.cf entry
* its own name space. Until then, we may log false warnings for unused
* "-o name=value" entries.
* its own name space. Until then, we always log "unused parameter"
* warnings for "-o user-defined-name=value" entries.
*/
for (argvp = master_table; (argv = *argvp) != 0; argvp++) {
for (field = MASTER_FIELD_COUNT; argv->argv[field] != 0; field++) {

View File

@@ -0,0 +1,15 @@
whatevershebrings_delivery_slot_cost = $default_delivery_slot_cost
whatevershebrings_delivery_slot_discount = $default_delivery_slot_discount
whatevershebrings_delivery_slot_loan = $default_delivery_slot_loan
whatevershebrings_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
whatevershebrings_destination_concurrency_limit = $default_destination_concurrency_limit
whatevershebrings_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
whatevershebrings_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
whatevershebrings_destination_rate_delay = $default_destination_rate_delay
whatevershebrings_destination_recipient_limit = $default_destination_recipient_limit
whatevershebrings_extra_recipient_limit = $default_extra_recipient_limit
whatevershebrings_initial_destination_concurrency = $initial_destination_concurrency
whatevershebrings_minimum_delivery_slots = $default_minimum_delivery_slots
whatevershebrings_recipient_limit = $default_recipient_limit
whatevershebrings_recipient_refill_delay = $default_recipient_refill_delay
whatevershebrings_recipient_refill_limit = $default_recipient_refill_limit

View File

@@ -0,0 +1 @@
whatevershebrings_time_limit = $command_time_limit

View File

@@ -0,0 +1 @@
whatevershebrings_time_limit = 1

View File

@@ -335,6 +335,15 @@ typedef struct SINK_STATE {
#define SOFT_ERROR_RESP "450 4.3.0 Error: command failed"
#define HARD_ERROR_RESP "500 5.3.0 Error: command failed"
/*
* We can't rely on vstream auto-flushing, so we have to prepare for the
* next read request.
*/
#define SMTP_FLUSH(fp) do { \
if (vstream_peek(fp) <= 0 && readable(vstream_fileno(fp)) <= 0) \
smtp_flush(fp); \
} while (0)
static int var_tmout = 100;
static int var_max_line_length = 2048;
static char *var_myhostname;
@@ -387,7 +396,7 @@ static void do_stats(void)
static void hard_err_resp(SINK_STATE *state)
{
smtp_printf(state->stream, "%s", hard_error_resp);
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
}
/* soft_err_resp - generic soft error response */
@@ -395,7 +404,7 @@ static void hard_err_resp(SINK_STATE *state)
static void soft_err_resp(SINK_STATE *state)
{
smtp_printf(state->stream, "%s", soft_error_resp);
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
}
/* exp_path_template - expand template pathname, static result */
@@ -618,7 +627,7 @@ static void ehlo_response(SINK_STATE *state, const char *args)
smtp_printf(state->stream, "250-ENHANCEDSTATUSCODES");
/* RFC 821/2821/5321: Format is replycode<SPACE>optional-text<CRLF> */
smtp_printf(state->stream, "250 ");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
if (single_template) {
if (state->helo_args)
myfree(state->helo_args);
@@ -635,7 +644,7 @@ static void helo_response(SINK_STATE *state, const char *args)
mail_cmd_reset(state);
state->client_proto = "SMTP";
smtp_printf(state->stream, "250 %s", var_myhostname);
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
if (single_template) {
if (state->helo_args)
myfree(state->helo_args);
@@ -649,7 +658,7 @@ static void helo_response(SINK_STATE *state, const char *args)
static void ok_response(SINK_STATE *state, const char *unused_args)
{
smtp_printf(state->stream, "250 2.0.0 Ok");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
}
/* rset_response - reset, send 250 OK */
@@ -658,7 +667,7 @@ static void rset_response(SINK_STATE *state, const char *unused_args)
{
mail_cmd_reset(state);
smtp_printf(state->stream, "250 2.1.0 Ok");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
}
/* mail_response - reset recipient count, send 250 OK */
@@ -667,13 +676,13 @@ static void mail_response(SINK_STATE *state, const char *args)
{
if (state->in_mail) {
smtp_printf(state->stream, "503 5.5.1 Error: nested MAIL command");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
return;
}
state->in_mail++;
state->rcpts = 0;
smtp_printf(state->stream, "250 2.1.0 Ok");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
if (single_template) {
mail_file_open(state);
SKIP(args, *args != ':');
@@ -689,12 +698,12 @@ static void rcpt_response(SINK_STATE *state, const char *args)
{
if (state->in_mail == 0) {
smtp_printf(state->stream, "503 5.5.1 Error: need MAIL command");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
return;
}
state->rcpts++;
smtp_printf(state->stream, "250 2.1.5 Ok");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
/* Note: there may be more than one recipient per mail transaction. */
if (state->dump_file) {
SKIP(args, *args != ':');
@@ -711,7 +720,7 @@ static void abort_event(int unused_event, char *context)
SINK_STATE *state = (SINK_STATE *) context;
smtp_printf(state->stream, "550 This violates SMTP");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
disconnect(state);
}
@@ -721,13 +730,13 @@ static void data_response(SINK_STATE *state, const char *unused_args)
{
if (state->in_mail == 0 || state->rcpts == 0) {
smtp_printf(state->stream, "503 5.5.1 Error: need RCPT command");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
return;
}
/* Not: ST_ANY. */
state->data_state = ST_CR_LF;
smtp_printf(state->stream, "354 End data with <CR><LF>.<CR><LF>");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
if (abort_delay < 0) {
state->read_fn = data_read;
} else {
@@ -750,7 +759,7 @@ static void dot_resp_hard(SINK_STATE *state)
} else {
smtp_printf(state->stream, "%s", hard_error_resp);
}
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
}
/* dot_resp_soft - soft error response to . command */
@@ -763,7 +772,7 @@ static void dot_resp_soft(SINK_STATE *state)
} else {
smtp_printf(state->stream, "%s", soft_error_resp);
}
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
}
/* dot_response - response to . command */
@@ -776,7 +785,7 @@ static void dot_response(SINK_STATE *state, const char *unused_args)
} else {
smtp_printf(state->stream, "250 2.0.0 Ok");
}
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
}
/* quit_response - respond to QUIT command */
@@ -784,7 +793,7 @@ static void dot_response(SINK_STATE *state, const char *unused_args)
static void quit_response(SINK_STATE *state, const char *unused_args)
{
smtp_printf(state->stream, "221 Bye");
smtp_flush(state->stream);
smtp_flush(state->stream); /* not: SMTP_FLUSH */
if (count)
quit_count++;
}
@@ -799,7 +808,7 @@ static void conn_response(SINK_STATE *state, const char *unused_args)
smtp_printf(state->stream, "220 %s", var_myhostname);
else
smtp_printf(state->stream, "220 %s ESMTP", var_myhostname);
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
}
/* delay_event - delayed command response */
@@ -1175,7 +1184,7 @@ static int command_read(SINK_STATE *state)
msg_info("%s", ptr);
if ((command = mystrtok(&ptr, " \t")) == 0) {
smtp_printf(state->stream, "500 5.5.2 Error: unknown command");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
return (0);
}
for (cmdp = command_table; cmdp->name != 0; cmdp++)
@@ -1183,7 +1192,7 @@ static int command_read(SINK_STATE *state)
break;
if (cmdp->name == 0 || (cmdp->flags & FLAG_ENABLE) == 0) {
smtp_printf(state->stream, "500 5.5.1 Error: unknown command");
smtp_flush(state->stream);
SMTP_FLUSH(state->stream);
return (0);
}
return (command_resp(state, cmdp, command, printable(ptr, '?')));

View File

@@ -219,7 +219,7 @@ INET_PROTO_INFO *inet_proto_init(const char *context, const char *protocols)
pf->dns_atype_list = make_unsigned_vector(3, T_A, T_AAAA, 0);
pf->sa_family_list = make_uchar_vector(3, AF_INET, AF_INET6, 0);
break;
} else if (errno == EAFNOSUPPORT) {
} else if (errno == EAFNOSUPPORT || errno == EPROTONOSUPPORT) {
msg_warn("%s: IPv6 support is disabled: %m", context);
msg_warn("%s: configuring for IPv4 support only", context);
/* FALLTHROUGH */

View File

@@ -371,11 +371,6 @@ XSASL_SERVER_IMPL *xsasl_dovecot_server_init(const char *server_type,
{
XSASL_DOVECOT_SERVER_IMPL *xp;
if (strchr(path_info, '/') == 0)
msg_warn("when SASL type is \"%s\", SASL path \"%s\" "
"should be a socket pathname",
server_type, path_info);
xp = (XSASL_DOVECOT_SERVER_IMPL *) mymalloc(sizeof(*xp));
xp->xsasl.create = xsasl_dovecot_server_create;
xp->xsasl.done = xsasl_dovecot_server_done;