diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2012-02-14 11:38:24 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2012-02-14 11:38:24 +0100 |
commit | d77d792c4abc6a198309501bd293dbf0252436b8 (patch) | |
tree | 15f748b3a5277d982fc1535442671c3d444808ea | |
parent | 90dfb21d9d03a336a4a8ee4b747b2236ac8686ea (diff) | |
download | gnutls-d77d792c4abc6a198309501bd293dbf0252436b8.tar.gz |
handle GNUTLS_E_INTERRUPTED when in DTLS mode.
-rw-r--r-- | lib/gnutls_buffers.c | 2 | ||||
-rw-r--r-- | lib/gnutls_dtls.c | 4 | ||||
-rw-r--r-- | lib/gnutls_dtls.h | 7 | ||||
-rw-r--r-- | lib/gnutls_record.c | 2 |
4 files changed, 9 insertions, 6 deletions
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: |