Victor Duchovni:
> On Wed, Mar 10, 2010 at 08:23:00AM -0500, Wietse Venema wrote:
>
> > > Mar 10 04:59:46 xxxxxxx postfix/smtpd[93352]: <
> > > xxxxxx.my_domain.com[192.168.1.101]: QUIT
> > > Mar 10 04:59:46 xxxxxxx postfix/smtpd[93352]: >
> > > xxxxxx.my_domain.com[192.168.1.101]: 221 2.0.0 Bye
> > > Mar 10 04:59:46 xxxxxxx postfix/smtpd[93352]: warning:
> > > network_biopair_interop: error reading 5 bytes from the network:
> > > Connection reset by peer
> >
> > The client sends QUIT and disconnects. It's not going to wait for
> > the server's "220 Bye" response. If the server were to report an
> > error, there is nothing the client could do anyway.
>
> With TLS sessions, after "QUIT" processing, the server tries to perform
> a clean SSL_shutdown() of the SSL/TLS session. If the client closes
> the connection without performing the SSL_shutdown(), you'll see the
> above warning. From the SSL_shutdown(3) manpage:
>
> NOTES
> SSL_shutdown() tries to send the "close notify" shutdown
> alert to the peer. Whether the operation succeeds or not, the
> SSL_SENT_SHUTDOWN flag is set and a currently open session is
> considered closed and good and will be kept in the session cache
> for further reuse.
>
> The shutdown procedure consists of 2 steps: the sending of the
> "close notify" shutdown alert and the reception of the peer's
> "close notify" shutdown alert. According to the TLS standard, it
> is acceptable for an application to only send its shutdown alert
> and then close the underlying connection without waiting for the
> peer's response (this way resources can be saved, as the process
> can already terminate or serve another connection). When the
> underlying connection shall be used for more communications,
> the complete shutdown procedure (bidirectional "close notify"
> alerts) must be performed, so that the peers stay synchronized.
>
> Another option (given that Postfix does not have a "STOPTLS" feature that
> would allow re-use of the physical connection for further I/O after SSL
> shutdown)
The Postfix SMTP client does properly shutdown the connnection.
smtp_session_free() calls tls_client_stop().
tls_client_stop() is an alias for tls_session_stop().
tls_session_stop() calls tls_bio_shutdown().
tls_bio_shutdown() is an alias that calls SSL_shutdown().
Sending application-level data after turning off TLS is definitely
a no-no.
That leaves us with redundant error handling in Postfix: logging
a warning with errno, and then passing the error up-stream where
we know that the error is harmless. The fix is not to log that
condition by default.
> is for Postfix to not do a full (bi-directional) SSL_shutdown(),
> and just send the "close notify" without waiting for a peer response.
Wietse