SSL_read empty -> close?

Felipe Gasper felipe at felipegasper.com
Thu Nov 3 16:42:58 UTC 2022


> On Nov 3, 2022, at 11:37, Michael Wojcik via openssl-users <openssl-users at openssl.org> wrote:
> 
>> It’s a rare
>> issue, but when it does it’s a head-scratcher. To avoid that, it’s necessary
>> to shutdown(SHUT_RD) then drain the read buffer before close().
> 
> Well, it's not *necessary* to do a half-close. Applications often know when they've received all the data the peer intends to send, thanks to record-delimiting mechanisms in the application protocol.
> 
> And your description looks wrong anyway: shutdown(SHUT_RD) has implementation-defined behavior for TCP sockets (because TCP does not announce the read side of half-close to the peer), and on Linux causes blocked receives and subsequent receives to return 0 (according to references -- I have't tested it), which means after shutdown(SHUT_RD) you *can't* drain the receive buffer. shutdown(SHUT_WR) would work, since it sends a FIN, telling the peer you won't be sending any more data, and still allows you to receive.

perl -MSocket -MIO::Socket::INET -e'my $s = IO::Socket::INET->new( Server => 1, Listen => 1 ) or die; my $port = $s->sockport(); my $c = IO::Socket::INET->new("localhost:$port") or die; syswrite $c, "hello"; my $sc = $s->accept(); shutdown($sc, SHUT_RD); sysread $sc, my $buf, 512 or die $!; print $buf'

^^ The above, I believe, demonstrates to the contrary: the read buffer is populated prior to shutdown and drained afterward.

>> I would guess that many don’t and just don’t see the
>> RST thing frequently enough to worry about it. Regardless, the documentation
>> is already pretty voluminous, so if this doesn’t bite many folks, then hey.
> 
> Yes, but wiki articles are always appreciated.

I’ll see if I can whip something up.

-FG


More information about the openssl-users mailing list