Hi All,

We have an application that uses the curl multi interface. We found that in
specific cases if the connection is abruptly closed, the underlying socket
is listed in a close_wait state. We continue to call the
curl_multi_perform, curl_mutli_fdset etc. None of these APIs report the
socket closed / connection finished.  Since we have cases where the multi
connection is only used once, this can pose a problem for us. I've read
that if another connection was to come in, curl would see the socket as bad
and attempt to close it at that time - unfortunately, this does not work
for us.

What I've found is that in specific situations, if SSL_write returns 0,
curl does not recognize the socket as closed (or errored out) and does not
report it to the application. I believe we need to change the code
slightly, to check if ssl_write returns 0. If so, treat it as an error -
the same as a negative return code.

For OpenSSL - the ssl_write documentation is here:
http://www.openssl.org/docs/ssl/SSL_write.html

My proposed patch is below.

Thanks!

Mike

diff --git a/lib/ssluse.c b/lib/ssluse.c****

index 22d8bcb..248c403 100644****

--- a/lib/ssluse.c****

+++ b/lib/ssluse.c****

@@ -2645,7 +2654,14 @@ static ssize_t ossl_send(struct connectdata *conn,***
*

   memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;****

   rc = SSL_write(conn->ssl[sockindex].handle, mem, memlen);****

****

-  if(rc < 0) {****

+  /* need to make sure that if ssl_write returns any error we note it****

+   *  according to open ssl documentation if ssl_write returns 0 it means**
**

+   *  "The write operation was not successful. Probably the underlying
connection was closed."****

+   *  We noticed some cases where if an abnormal disconnect occurs, a
socket would get stuck****

+   *  in a "close_wait" state.****

+   *  http://www.openssl.org/docs/ssl/SSL_write.html****

+   */****

+  if(rc <= 0) {****

     err = SSL_get_error(conn->ssl[sockindex].handle, rc);****

****

     switch(err) {
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html

Reply via email to