From: Nikos Mavrogiannopoulos Date: Tue, 14 Feb 2012 10:38:24 +0000 (+0100) Subject: handle GNUTLS_E_INTERRUPTED when in DTLS mode. X-Git-Tag: gnutls_3_0_13~48 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d77d792c4abc6a198309501bd293dbf0252436b8;p=thirdparty%2Fgnutls.git handle GNUTLS_E_INTERRUPTED when in DTLS mode. --- diff --git a/lib/gnutls_buffers.c b/lib/gnutls_buffers.c index 8f9c741193..80b5b22039 100644 --- a/lib/gnutls_buffers.c +++ b/lib/gnutls_buffers.c @@ -961,7 +961,7 @@ handshake_buffer_st* recv_buf = session->internals.handshake_recv_buffer; } timeout: - RETURN_DTLS_EAGAIN_OR_TIMEOUT(session); + RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, 0); } /* This is a receive function for the gnutls handshake diff --git a/lib/gnutls_dtls.c b/lib/gnutls_dtls.c index 0cae4fa1a5..62ac934f27 100644 --- a/lib/gnutls_dtls.c +++ b/lib/gnutls_dtls.c @@ -388,7 +388,7 @@ nb_timeout: if (buf != NULL) gnutls_free(buf); - RETURN_DTLS_EAGAIN_OR_TIMEOUT(session); + RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, ret); } /* Waits for the last flight or retransmits @@ -409,7 +409,7 @@ int ret; ret = _dtls_retransmit(session); if (ret == 0) { - RETURN_DTLS_EAGAIN_OR_TIMEOUT(session); + RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, 0); } else return gnutls_assert_val(ret); diff --git a/lib/gnutls_dtls.h b/lib/gnutls_dtls.h index b910d3dd39..467b3e98c5 100644 --- a/lib/gnutls_dtls.h +++ b/lib/gnutls_dtls.h @@ -42,7 +42,7 @@ inline static unsigned int timespec_sub_ms(struct timespec *a, struct timespec * (b->tv_sec * 1000 + b->tv_nsec / (1000 * 1000))); } -#define RETURN_DTLS_EAGAIN_OR_TIMEOUT(session) { \ +#define RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, r) { \ struct timespec now; \ unsigned int diff; \ gettime(&now); \ @@ -55,9 +55,12 @@ inline static unsigned int timespec_sub_ms(struct timespec *a, struct timespec * } \ else \ { \ + int rr; \ + if (r != GNUTLS_E_INTERRUPTED) rr = GNUTLS_E_AGAIN; \ + else rr = r; \ if (session->internals.dtls.blocking != 0) \ millisleep(50); \ - return gnutls_assert_val(GNUTLS_E_AGAIN); \ + return gnutls_assert_val(rr); \ } \ } diff --git a/lib/gnutls_record.c b/lib/gnutls_record.c index 1fca22e4f6..ebe1b1a266 100644 --- a/lib/gnutls_record.c +++ b/lib/gnutls_record.c @@ -731,7 +731,7 @@ unexpected_packet: if (IS_DTLS(session) && ret != GNUTLS_E_REHANDSHAKE) { _mbuffer_xfree(&bufel); - RETURN_DTLS_EAGAIN_OR_TIMEOUT(session); + RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, ret); } cleanup: