Re: Postfix not sending SMFIC_RCPT to milter, libmilter rejecting state transition

2009-09-19 Thread Stephen Warren
Wietse Venema wrote:
 Wietse Venema:
 Postfix VSTREAMs automatically flush output on the next read
 operation; a lot of things depend on this, including the SMTP client
 and SMTP server protocol implementations. This is how Postfix avoids
 sending silly little network packets.

 In the case of skipping Milter replies, the idea is that queued
 SMFIC_RCPT messages will be eventually be flushed when Postfix
 reads a response from the Milter application; normally that
 would be at or before the end-of-body reply.

 I am surprised that the VSTREAM doesn't flush SMFIC_RCPT as it
 should; normally one has to jump ugly hoops to lose output like
 that.
 
 My hypothesis is as follows: the automatic flush-before-read did
 not happen, because the write and the read operations were done 
 in different processes (and therefore, on different VSTREAMs).
 
 Specifically, the VSTREAM in the smtpd process did not automatically
 flush RCPT requests to the Milter socket, because the next read
 request on that Milter socket was done on a different VSTREAM in
 a cleanup process.
 
 Please see if the patch below solves the problem.

Yes, it does. Thanks.

 *** ./milter8.c-  Sat Jul 11 20:27:15 2009
 --- ./milter8.c   Fri Sep 18 16:38:11 2009
 ***
 *** 2584,2589 
 --- 2584,2596 
   if (msg_verbose)
   msg_info(%s: milter %s, myname, milter-m.name);
   
 + /*
 +  * The next read on this Milter socket happens in a different process. 
 It
 +  * will not automatically flush the output buffer in this process.
 +  */
 + if (milter-fp)
 + vstream_fflush(milter-fp);
 + 
   if (attr_print(stream, ATTR_FLAG_MORE,
  ATTR_TYPE_STR, MAIL_ATTR_MILT_NAME, milter-m.name,
  ATTR_TYPE_INT, MAIL_ATTR_MILT_VERS, milter-version,


Re: Postfix not sending SMFIC_RCPT to milter, libmilter rejecting state transition

2009-09-18 Thread Wietse Venema
Wietse Venema:
 Postfix VSTREAMs automatically flush output on the next read
 operation; a lot of things depend on this, including the SMTP client
 and SMTP server protocol implementations. This is how Postfix avoids
 sending silly little network packets.
 
 In the case of skipping Milter replies, the idea is that queued
 SMFIC_RCPT messages will be eventually be flushed when Postfix
 reads a response from the Milter application; normally that
 would be at or before the end-of-body reply.
 
 I am surprised that the VSTREAM doesn't flush SMFIC_RCPT as it
 should; normally one has to jump ugly hoops to lose output like
 that.

My hypothesis is as follows: the automatic flush-before-read did
not happen, because the write and the read operations were done 
in different processes (and therefore, on different VSTREAMs).

Specifically, the VSTREAM in the smtpd process did not automatically
flush RCPT requests to the Milter socket, because the next read
request on that Milter socket was done on a different VSTREAM in
a cleanup process.

Please see if the patch below solves the problem.

Wietse

*** ./milter8.c-Sat Jul 11 20:27:15 2009
--- ./milter8.c Fri Sep 18 16:38:11 2009
***
*** 2584,2589 
--- 2584,2596 
  if (msg_verbose)
msg_info(%s: milter %s, myname, milter-m.name);
  
+ /*
+  * The next read on this Milter socket happens in a different process. It
+  * will not automatically flush the output buffer in this process.
+  */
+ if (milter-fp)
+   vstream_fflush(milter-fp);
+ 
  if (attr_print(stream, ATTR_FLAG_MORE,
   ATTR_TYPE_STR, MAIL_ATTR_MILT_NAME, milter-m.name,
   ATTR_TYPE_INT, MAIL_ATTR_MILT_VERS, milter-version,