diff options
author | joe <joe@61a7d7f5-40b7-0310-9c16-bb0ea8cb1845> | 2009-01-29 01:14:28 +0000 |
---|---|---|
committer | joe <joe@61a7d7f5-40b7-0310-9c16-bb0ea8cb1845> | 2009-01-29 01:14:28 +0000 |
commit | 9ac0752a79420caa624ec82b350489b2b7c552e6 (patch) | |
tree | b03d2706f1f84cb275fa0048c0a06171b95fd685 | |
parent | afe553f45fdaba53e373c60d52fbbb153a5fd08b (diff) | |
download | neon-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.c | 9 |
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); |