[openssl-users] Nonblocking IO: Kindly need your urgent authoritative confirmation that the OpenSSL API's SSL_read and SSL_write and select() must indeed be used together *exactly* like this, as to keep us all safe (from infinite loop & zombification bugs)!

Tinker tinkr at openmailbox.org
Wed Feb 25 11:28:26 UTC 2015

Hi Graham,

Thank you a lot for your response! -

Just to merge this properly with your previous response to another 
thread this past Sat the 21:st in 

It's not just “I want to read during SSL_write, are you ok with me doing 
this?” but rather "I want to read during SSL_write [nevermind if I tried 
already or not]. Please invoke me next time when there's actual input 
data available, thank you." -

SSL_ERROR_WANTS_READ/WRITE is how OpenSSL says that it needs more data 
on the socket ie asks user to select() with the socket in readfds and 
reinvoke when there is more data, or it wants to write for the socket 
and it's not writable anymore now, so it asks the user to select() with 
the socket in writefds and reinvoke when it's writable, right?

I.e. the if_ready_to_read/if_ready_to_write you suggested below would 
generally be implemented in terms of a select() call.

And then of course, as a caller I'm not obliged to do a select() and 
reiterate but I may do anything, or do another SSL operation such as 
another SSL_read or SSL_shutdown (though supposedly also that one would 
return with the same SSL_ERROR_WANTS_READ/WRITE so that would just be to 
postpone the problem) right?

..And also I suppose this means you confirm that all the points in my 
previous email were correct.

Thanks :)

On 2015-02-24 20:48, Graham Leggett wrote:
> On 22 Feb 2015, at 11:22 PM, Tinker <tinkr at openmailbox.org> wrote:
>> I need your authoritative answer on the following question.
> [snip stuff that is too long]
> You are totally overthinking this.
> The SSL protocol involves negotiation, during which the sender and the
> receiver exchange data with each other. What this means is that during
> either SSL_read, or SSL_write, openssl might try to write or read
> respectively. If your non-blocking code isn’t geared to handle this,
> you might end up either hanging or spinning as you wait for the wrong
> event.
> The SSL_WANTS_READ response code is a warning that means “I want to
> read during SSL_write, are you ok with me doing this?”.
> The SSL_WANTS_WRITE response code is a warning that means “I want to
> write during SSL_read, are you ok with me doing this?”.
> In both cases, once you have determined that it is ok to read, or ok
> to write, you simply retry SSL_write() or SSL_read() again.
> For example, a read loop:
> sense = READ;
> while (sense == READ ? if_ready_to_read() : if_ready_to_write()) {
>     rc = SSL_read();
>     if (rc == SSL_WANT_WRITE) {
>         sense = WRITE;
>     } else {
>         sense = READ;
>     }
>     // do stuff with what you read (you may have read nothing, but
> that’s fine too)
> }
> Regards,
> Graham
> _______________________________________________
> openssl-users mailing list
> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users

More information about the openssl-users mailing list