2006-04-18 Mikael Hallendal <micke@imendio.com>
authorhallski <hallski>
Tue, 18 Apr 2006 13:47:21 +0000 (13:47 +0000)
committerhallski <hallski>
Tue, 18 Apr 2006 13:47:21 +0000 (13:47 +0000)
* loudmouth/lm-ssl-openssl.c: (_lm_ssl_begin):
- Fixed an issue reported by Martyn when using non-blocking sockets.

ChangeLog
loudmouth/lm-ssl-openssl.c

index 3f97f6c528f8d932f274e1b99d9e5e564c5b6abb..4c4501eb4ac2eb4e95fa82126abb3d97650ab531 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-04-18  Mikael Hallendal  <micke@imendio.com>
+
+       * loudmouth/lm-ssl-openssl.c: (_lm_ssl_begin):
+       - Fixed an issue reported by Martyn when using non-blocking sockets.
+
 2006-04-12  Mikael Hallendal  <micke@imendio.com>
 
        * autogen.sh:
index 37b9eb6b4bd7b033a53b343b054bc61398a33296..d58c995d9c0d6b2ad1b85e57854572328d985a60 100644 (file)
@@ -122,19 +122,36 @@ _lm_ssl_initialize (LmSSL *ssl)
 gboolean
 _lm_ssl_begin (LmSSL *ssl, gint fd, const gchar *server, GError **error)
 {
-       BIO      *sbio;
+       BIO       *sbio;
+       GIOStatus  status;
 
        ssl->session = SSL_new (ssl->ctx);
        sbio = BIO_new_socket (fd, BIO_NOCLOSE);
        SSL_set_bio (ssl->session, sbio, sbio);
 
-       if (SSL_connect (ssl->session) <= 0) {
-               g_set_error (error, 
-                            LM_ERROR, LM_ERROR_CONNECTION_OPEN,
-                            "*** OpenSSL handshake failed");
+       while (TRUE) {
+               gint ret;
 
-               return FALSE;   /* Error */
-       } 
+               ret = SSL_connect (ssl->session);
+
+               if (ret > 0) {
+                       /* Successful */
+                       break;
+               }
+               else {
+                       status = ssl_io_status_from_return (ssl, ret);
+                       if (status == G_IO_STATUS_AGAIN) {
+                               /* Try again */
+                               continue;
+                       } else {
+                               g_set_error (error, 
+                                            LM_ERROR, LM_ERROR_CONNECTION_OPEN,
+                                            "*** OpenSSL handshake failed");
+                               return FALSE;
+                       }
+
+               }
+       }
 
        if (!ssl_verify_certificate (ssl, server)) {
                g_set_error (error,