summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoe <joe@61a7d7f5-40b7-0310-9c16-bb0ea8cb1845>2009-01-29 01:14:28 +0000
committerjoe <joe@61a7d7f5-40b7-0310-9c16-bb0ea8cb1845>2009-01-29 01:14:28 +0000
commit9ac0752a79420caa624ec82b350489b2b7c552e6 (patch)
treeb03d2706f1f84cb275fa0048c0a06171b95fd685
parentafe553f45fdaba53e373c60d52fbbb153a5fd08b (diff)
downloadneon-9ac0752a79420caa624ec82b350489b2b7c552e6.tar.gz
Merge r1620 from trunk:
* src/ne_socket.c (read_gnutls): Perform a new handshake if required and indicated by a gnutls_record_recv() failure. git-svn-id: http://svn.webdav.org/repos/projects/neon/branches/0.28.x@1624 61a7d7f5-40b7-0310-9c16-bb0ea8cb1845
-rw-r--r--src/ne_socket.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/ne_socket.c b/src/ne_socket.c
index df3462d..ed26097 100644
--- a/src/ne_socket.c
+++ b/src/ne_socket.c
@@ -705,13 +705,18 @@ static ssize_t error_gnutls(ne_socket *sock, ssize_t sret)
static ssize_t read_gnutls(ne_socket *sock, char *buffer, size_t len)
{
ssize_t ret;
+ unsigned reneg = 1; /* number of allowed rehandshakes */
ret = readable_gnutls(sock, sock->rdtimeout);
if (ret) return ret;
do {
- ret = gnutls_record_recv(sock->ssl, buffer, len);
- } while (RETRY_GNUTLS(sock, ret));
+ do {
+ ret = gnutls_record_recv(sock->ssl, buffer, len);
+ } while (RETRY_GNUTLS(sock, ret));
+
+ } while (ret == GNUTLS_E_REHANDSHAKE && reneg--
+ && (ret = gnutls_handshake(sock->ssl)) == GNUTLS_E_SUCCESS);
if (ret <= 0)
ret = error_gnutls(sock, ret);