[EMAIL PROTECTED] wrote:
> I have an application which is occasionally hanging. I have tracked it
> down to an SSL_shutdown call.

There is an issue with SSL_shutdown() on non-blocking sockets in respect of knowing when to use the shutdown() call.

I'm not exactly sure if you have run into this problem, since you did not say if your application uses the system call shutdown() at all. If it doesn't then disregard the rest of this email.


Can you confirm if your application uses the shutdown() system call at all ?

If it does:
* at what time does it call it in respect of using the socket for SSL and the other OpenSSL API calls ? * how is it used, as shutdown() can be called to shutdown one half of the communication, which half to you shutdown and when (in respect of OpenSSL API calls) ?



The problem that I am aware of is that when using SSL_shutdown() to emit a shutdown_notify packet (part of the SSL/TLS protocol spec) it is not clear when the entire data for the packet has made it into the kernel buffer, as the usual WANT_READ and WANT_WRITE mechanism are not convey to the application correctly with the usualy -1 error return.

I have created a path that fixes this problem (which does the following) :

* Makes SSL_shutdown() return -1/WANT_WRITE if the initial call(s) to SSL_shutdown() are unable to commit the entire shutdown_notify packet into the kernel buffer / BIO layer.

* It only returns 0 once just after the moment when the shutdown_notify packet has just been committed by this invocation of SSL_shutdown(). At this point in time the application may now call shutdown(fd, SHUT_WR) because OpenSSL has no further use for writing to the socket anymore.

* Subsequent calls to SSL_shutdown() now return -1/WANT_READ when it has sucessfully return 0 previously but it still has not received the incoming shutdown_notify from the remote end.

* Upon recving the shutdown_notify packet from the remote end SSL_shutdown() now return 1. At this point in time the application may now call shutdown(fd, SHUT_RD) or close(fd) since OpenSSL has not futher use for reading or writing to the socket anymore.


My patch does not change the way SSL_shutdown() work in relation to the man page it still returns 0 and 1 but it also can now return -1/WANT_WRITE and -1/WANT_READ to indicate what OpenSSL is waiting on to push through the SSL_shutdown() instruction to the next stage.



If you think this related to your problem, please examine the previous discussion (hope the links still work) :

http://marc.info/?t=115099728200002&r=1&w=2
http://marc.info/?t=115154004000001&r=1&w=2
http://marc.info/?t=115129081200001&r=1&w=2
http://marc.info/?l=openssl-dev&m=116525974320575&w=2

http://marc.info/?l=openssl-dev&m=115153998821797&w=2
http://marc.info/?l=openssl-dev&m=115153957132635&w=2

and comment back to the list on how your situation relates to this.



The value (0) returned from the shutdown call indicates that the shutdown is not finished. The shutdown man page indicates that a second call to SSL_shutdown should cause a bidirectional shutdown, and I thought this is indeed what the application calls for. However, when I make the second call to SSL_shutdown, the value returned is still 0 (shutdown not finished) rather than 1 (shutdown complete) or -1 (shutdown not successful). Is this recently added bahavior? Does the SSL handle need to have certain properties in order to get a bidirectional shutdown?

No it has always done this. The stickyness of returning "0" is a failure (IMHO) in the existing release code. Since "0" is meaningless as the application doesn't know if its waiting to read or write and the application NEEDS to know that in order to know how to wait on the non-blocking socket for it to change state so that SSL_shutdown() can be called again.

The application also NEEDS to know at the earliest point in time when shutdown(fd, SHUT_WR) may be called. At the moment its just not possible to know when to call it since at the point in time SSL_shutdown() does return 1 you might as well call close(fd).


Darryl

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to