[stunnel-users] Premature socket closure - race condition bug?
Graham Nayler (work)
graham.nayler at hallmarq.net
Mon Sep 15 16:04:27 CEST 2014
Dear All,
After a recent upgrade I'm currently experiencing intermittent problems with
securing bidirectional comms traffic for a moitoring program with stunnel.
The system is:
70+ Client machines running BBWin on Windows (mostly 7) -> stunnel 5.01
.....internet......stunnel 5.02 -> Xymon running on 64-bit Linux Mint 17
(Virtual machine inside 2012 R2 Essentials server)
Prior to the recent upgrade, the server was an approx 3 year old 32-bit
Ubuntu server, running stunnel 4.56. Comms then worked (mostly) fine for our
client machines.
Since the upgrade, client requests for information from the server have been
largely failing. Running the comms with direct unsecured socket connections
work fine.
I've spent a bit of time over the last couple of days looking at the source
for both Stunnel and BBWin and it looks to me as if there is a disconnect in
understanding between BBWin and Stunnel as to how read and write connections
work.
The BBWin Client makes the connection, then issues (in essence) the
following sequence:
send(connection, msg)
shutdown(connection, SHUT_WR)
do recv(connection....) until it returns zero or SOCKET_ERROR
shutdown(connection, SHUT_RD)
shutdown(connection, SHUT_BOTH)
closesocket(connection)
i.e. the client shuts down the transmission side as soon as it's done, then
shuts down the receive side only once it's finished receiving any returned
data.
I atttach Stunnel logs for both client and server for both failed and
successful transfers. I've added a little more debugging output to the
server Stunnel instance to display the data being read and written to both
the socket and SSL side of the comms. This shows that the only difference
between the two is that in the successful transfer the server receives and
passes on data from the socket to SSL before starting the shutdown. So that
looks fine - when it works. But when it doesn't, it looks just as if the
return path is shut down before the server app has had time to retrieve the
data to be returned
Looking at the stunnel code though, I'm confused - and my suspicion is that
stunnel (on the client machine) is closing the SSL connection prematurely..
It looks as if it issues the SSL_shutdown command (client.c line 855) if:
it's not already sent the shutdown
the read fd on the socket is closed
there's nothing left in the outboud queue (sock_ptr is 0)
and SSL wants a retry (? I don't yet understand write_wants_write
usage).
That's all very well for closing the outbound side, but what about the
inbound? Surely it should keep the SSL open until either it's notified by
the other side that everything is closed down there, or BOTH read and write
on the socket side have been shutdown. A further point of confusion is that
the stunnel code handles read and write fds for each of SSL and socket
independently, but for most cases they are both set to the same value. Is
there some confusion about handling s_poll_hup()? I freely admit I don't
understand fully how this works, as I've only had a day's experience of this
comms stuff, and it looks pretty well thought out, but there's logic here
for handling the inbound and outbound sides independently, so SSL should
remain open while any one of those two channel remains active?
The bottom line is that the comms:
a) works reliably when not routed through stunnel
b) works reliably to transmit from client to server
b) now works (in reception) less than 10% of the time when using stunnel -
but does work occasionally
It worked fairly reliably with 5.01 on the clients and 4.56 on a slowish
server, and now doesn't on 5.02 on a highish spec server, with client
software/hardware unchanged. My suspicion is that improving the spec on the
server has exposed a race condition on the client installation.
Any thoughts?
Graham Nayler
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: StunnelLogs.txt
URL: <http://www.stunnel.org/pipermail/stunnel-users/attachments/20140915/55c71726/attachment.txt>
More information about the stunnel-users
mailing list