[openssl-users] Graceful shutdown of TLS connection for blocking sockets

Thomas J. Hruska shinelight at shininglightpro.com
Mon Oct 9 15:47:16 UTC 2017


On 10/9/2017 7:49 AM, Jakob Bohm wrote:
> On 09/10/2017 16:43, Thomas J. Hruska wrote:
>> On 10/9/2017 7:29 AM, Jakob Bohm wrote:
>>> I suggest you find a good authoritative source for your claim
>>> that select() should not be used with blocking sockets.
>>
>> http://man7.org/linux/man-pages/man2/select.2.html
>>
>> Section BUGS:
>>
>> "Under Linux, select() may report a socket file descriptor as "ready 
>> for reading", while nevertheless a subsequent read blocks. This could 
>> for example happen when data has arrived but upon examination has 
>> wrong checksum and is discarded.  There may be other circumstances in 
>> which a file descriptor is spuriously reported as ready.  Thus it may 
>> be safer to use O_NONBLOCK on sockets that should not block."
>>
>>
>> Authoritative enough for you?
>>
> That must be a recent change then.  But certainly that is a bug
> in Linux select, not in programs relying on the (long time)
> documented correct behavior.

The OpenSSL layer over TCP/IP complicates matters more across ALL 
platforms:  SSL_read() may need to write (and SSL_write() may need to 
read).  Even if the socket has data to read according to select(), if 
the respective write end is full (or vice versa for SSL_write()), then 
the call WILL block when using blocking sockets.

You can't resolve the above issue with select() or any other function 
UNLESS you switch to non-blocking socket descriptors.  From that point, 
the only logical conclusion that can be drawn is that select() is for 
non-blocking I/O only.  Then the documented "bug" in Linux becomes a 
misunderstanding of what select() is actually intended for across all 
platforms:  Preventing spurious CPU usage for non-blocking I/O. 
select() is just a notification that MAYBE you can read or MAYBE you can 
write, but there is no guarantee of either succeeding.

-- 
Thomas Hruska
Shining Light Productions

Home of BMP2AVI and Win32 OpenSSL.
http://www.slproweb.com/


More information about the openssl-users mailing list