]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
handle GNUTLS_E_INTERRUPTED when in DTLS mode.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 14 Feb 2012 10:38:24 +0000 (11:38 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 14 Feb 2012 10:38:24 +0000 (11:38 +0100)
lib/gnutls_buffers.c
lib/gnutls_dtls.c
lib/gnutls_dtls.h
lib/gnutls_record.c

index 8f9c7411934b1060c6d32f4049985ee236fe747a..80b5b22039cbc9ff5d8a17b4e80f935359ffce71 100644 (file)
@@ -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 
index 0cae4fa1a55c9a7bfdea1990c1649d1f7854ea53..62ac934f274ecd9210531c21a723ab0f20dbbce7 100644 (file)
@@ -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);
index b910d3dd398809afcf38dcb2421bcc00d7340296..467b3e98c596e2bf9bc9590ecc29a1a5be8af040 100644 (file)
@@ -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); \
     } \
   }
 
index 1fca22e4f684c2d07007bb08043d55fe0c691747..ebe1b1a2669548c82c3560b3f1c655816271b605 100644 (file)
@@ -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: