On Thursday, May 23, 2024 10:26 AM Matt Caswell wrote:
>On 23/05/2024 15:08, [email protected] wrote:
>> On Thursday, May 23, 2024 9:56 AM, Wiebe Cazemier wrote:
>>>> From: "Neil Horman" <[email protected]>
>>>> from:
>>>> [ https://www.openssl.org/docs/man1.0.2/man3/SSL_CTX_set_mode.html |
>>>> https://www.openssl.org/docs/man1.0.2/man3/SSL_CTX_set_mode.html ]
>>>
>>>> SSL_MODE_AUTO_RETRY in non-blocking mode should cause
>>>> SSL_reaa/SSL_write to return -1 with an error code of
>>>> WANT_READ/WANT_WRITE until such time as the re-negotiation has
>>>> completed. I need to confirm thats the case in the code, but it
>>>> seems to be. If the underlying socket is in non-blocking mode, there
>>>> should be no way for calls to block in SSL_read/SSL_write on the
>>>> socket read/write system
>>> call.
>>>
>>> I still don't really see what the difference is between
>>> SSL_MODE_AUTO_RETRY on or off in non-blocking mode?
>>>
>>> The person at [1] seems to have had a similar issue, and was
>>> convinced clearing SSL_MODE_AUTO_RETRY fixed it. But I agree, I don't know
>how it could be.
>>> OpenSSL would have to remove the O_NONBLOCK, or do select/poll, and I
>>> can't find it doing that.
>>>
>>> I hope it happens again soon and I'm around to attach a debugger.
>>
>> I may be incorrect here, but my interpretation is as follows:
>>
>> SSL_MODE_AUTO_RETRY on - if there is a packet ready to read on the socket, the
>packet is retrieved. Same for write. If not ready, because EWOULDBLOCK, the
>operation is retried automatically by OpenSSL.
>>
>> SSL_MODE_AUTO_RETRY off - if there is a packet ready to read on the socket, the
>packet is retrieved. Same for write. If not ready, the OpenSSL operation reports an
>error.
>
>Not quite.
>
>When you call SSL_read() it is because you are hoping to read application data.
>
>OpenSSL will go ahead and attempt to read a record from the socket. If there is no
>data (and you are using a non-blocking socket), or only a partial record available
>then the SSL_read() call will fail and indicate SSL_ERROR_WANT_READ.
>
>If a full record is available it will process it. If the record contains application data
>then the SSL_read() call will return successfully and provide the application data to
>the application.
>
>If the record contains non-application data (i.e. some TLS protocol message like a
>key update, or new session ticket) then, with SSL_MODE_AUTO_RETRY on it will
>automatically try and read another record (and the above process repeats). If
>SSL_MODE_AUTO_RETRY off it will not attempt to retry and the SSL_read() call will
>fail and indicate SSL_ERROR_WANT_READ.
>
> From an application perspective, if SSL_MODE_AUTO_RETRY is off with a non-
>blocking socket, it is not possible to tell the difference between "no record/only
>partial record is available" and "we tried to read application data but got a non-
>application data record". They both result in SSL_read() failing and indicating
>SSL_ERROR_WANT_READ.
>
>For non-blocking mode it really doesn't make much difference to the application.
>Either way it should not cause it to block.
Thanks Matt. That helps with my own understanding.
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.