summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2012-02-14 11:38:24 +0100
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2012-02-14 11:38:24 +0100
commitd77d792c4abc6a198309501bd293dbf0252436b8 (patch)
tree15f748b3a5277d982fc1535442671c3d444808ea
parent90dfb21d9d03a336a4a8ee4b747b2236ac8686ea (diff)
downloadgnutls-d77d792c4abc6a198309501bd293dbf0252436b8.tar.gz
handle GNUTLS_E_INTERRUPTED when in DTLS mode.
-rw-r--r--lib/gnutls_buffers.c2
-rw-r--r--lib/gnutls_dtls.c4
-rw-r--r--lib/gnutls_dtls.h7
-rw-r--r--lib/gnutls_record.c2
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: