summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Graveley <alex@ximian.com>2002-04-30 16:24:22 +0000
committerAlex Graveley <orph@src.gnome.org>2002-04-30 16:24:22 +0000
commite011e6b534fe43c29afe040615ed8439152882cd (patch)
treecb11734223b60789a6bf12d962d05134cc408397
parente730fe0658afb54c3b212e478ce46568ed4147ac (diff)
downloadlibsoup-e011e6b534fe43c29afe040615ed8439152882cd.tar.gz
Loop on SSL_connect until it either returns error or success, blocking on
2002-04-30 Alex Graveley <alex@ximian.com> * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_get_iochannel): Loop on SSL_connect until it either returns error or success, blocking on need-read/need-write if necessary.
-rw-r--r--ChangeLog6
-rw-r--r--libsoup/soup-openssl.c26
2 files changed, 27 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 23f19a46..22fcca24 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2002-04-30 Alex Graveley <alex@ximian.com>
+
+ * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_get_iochannel):
+ Loop on SSL_connect until it either returns error or success,
+ blocking on need-read/need-write if necessary.
+
2002-04-26 Dan Winship <danw@ximian.com>
* src/soup-ssl-proxy/soup-openssl.c (soup_openssl_read_cb): Fix
diff --git a/libsoup/soup-openssl.c b/libsoup/soup-openssl.c
index 3b836500..62ece5b5 100644
--- a/libsoup/soup-openssl.c
+++ b/libsoup/soup-openssl.c
@@ -285,11 +285,27 @@ soup_openssl_get_iochannel (GIOChannel *sock)
goto THROW_CREATE_ERROR;
}
- SSL_connect (ssl);
- if (err == 0) {
- g_warning ("Secure connection could not be established.");
- goto THROW_CREATE_ERROR;
- }
+ do {
+ fd_set ssl_fdset;
+
+ err = SSL_connect (ssl);
+ err = SSL_get_error (ssl, err);
+
+ if (err == SSL_ERROR_WANT_READ) {
+ FD_ZERO (&ssl_fdset);
+ FD_SET (sockfd, &ssl_fdset);
+ select (sockfd + 1, &ssl_fdset, NULL, NULL, NULL);
+ }
+ else if (err == SSL_ERROR_WANT_WRITE) {
+ FD_ZERO (&ssl_fdset);
+ FD_SET (sockfd, &ssl_fdset);
+ select (sockfd + 1, NULL, &ssl_fdset, NULL, NULL);
+ }
+ else if (err != SSL_ERROR_NONE) {
+ g_warning ("Could not establish secure connection.");
+ goto THROW_CREATE_ERROR;
+ }
+ } while (err != SSL_ERROR_NONE);
bits = SSL_get_cipher_bits (ssl, &alg_bits);
if (bits == 0) {