Hi,
Postfix 2.7.0 supports milter protocol 2, 3, 4 and
6. Postfix with milter_protocol=6 accepts a connection from
a milter that uses milter protocol 2. But its milter session
is broken because Postfix sends SMFIC_DATA event to the
milter. In milter protocol 2, SMFIC_DATA isn't supported. So
the connected milter can't reply SMFIC_DATA request. Postfix
logs the following warning message on the case:
Mar 20 10:25:09 mail postfix/smtpd[70678]: warning: milter
inet:localhost:20025: can't read SMFIC_DATA reply packet header: Unknown error: 0
Here is a work flow on the case:
SMTP Postfix milter
(protocol 6) (protocol 2)
telnet localhost smtp -->
negotiate -->
(protocol 6)
<-- negotiate reply
(protocol 2)
accept
connect -->
<-- connect reply
<-- 220
EHLO -->
helo -->
<-- helo reply
<-- 250
MAIL FROM -->
mail -->
<-- mail reply
<-- 250
RCPT TO -->
rcpt -->
<-- rcpt reply
<-- 250
DATA -->
data -->
UNKNOWN REQUEST
close connection
can't read
SMFIC_DATA reply
packet header:
Unknown error: 0
I'll attach a patch to fix it. Postfix doesn't send
any SMFIC_DATA to protocol 2 milter with the patch.
Thanks,
--
kou
--- postfix-2.7.0.orig/src/milter/milter8.c 2009-09-19 05:38:11.000000000 +0900
+++ postfix-2.7.0/src/milter/milter8.c 2010-03-20 10:12:32.000000000 +0900
@@ -1774,6 +1774,17 @@
}
if (milter->ev_mask & SMFIP_RCPT_REJ)
milter->m.flags |= MILTER_FLAG_WANT_RCPT_REJ;
+ {
+ int mask;
+ char version_string[2];
+
+ version_string[0] = milter->version + '0';
+ version_string[1] = '\0';
+ mask = name_code(milter8_event_masks, NAME_CODE_FLAG_NONE,
+ version_string);
+ if (mask != -1)
+ milter->np_mask |= (SMFIP_NOSEND_MASK & ~mask);
+ }
/*
* Initial negotiations completed.