gnutls-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU gnutls branch, master, updated. gnutls-3_0_12-170-ga64a322


From: Nikos Mavrogiannopoulos
Subject: [SCM] GNU gnutls branch, master, updated. gnutls-3_0_12-170-ga64a322
Date: Fri, 10 Feb 2012 00:00:54 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU gnutls".

http://git.savannah.gnu.org/cgit/gnutls.git/commit/?id=a64a322efe490dd63bbdd200223fbf109a74d003

The branch, master has been updated
       via  a64a322efe490dd63bbdd200223fbf109a74d003 (commit)
       via  da8d27b70f8de28c32db41e008c70845f8499b88 (commit)
       via  d178d1336a4716ff7ed563dbf1b4e020a97894fd (commit)
       via  5707888216f9f5f7af5e33e3b67890e85e5343ee (commit)
      from  6a5cd65eb414de857af984ed8fb6ad6b17d02cc1 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit a64a322efe490dd63bbdd200223fbf109a74d003
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Feb 10 01:05:18 2012 +0100

    More robust behavior against packet loss

commit da8d27b70f8de28c32db41e008c70845f8499b88
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Thu Feb 9 18:51:41 2012 +0100

    removed unneeded function.

commit d178d1336a4716ff7ed563dbf1b4e020a97894fd
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Thu Feb 9 08:23:14 2012 +0100

    updated example

commit 5707888216f9f5f7af5e33e3b67890e85e5343ee
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Thu Feb 9 08:13:28 2012 +0100

    updated

-----------------------------------------------------------------------

Summary of changes:
 doc/examples/ex-client-srp.c |    2 +-
 lib/gnutls_dtls.c            |  125 ++++++++++++++++++++----------------------
 lib/gnutls_record.c          |   29 +++++++---
 lib/system.c                 |    6 --
 lib/system.h                 |    2 -
 5 files changed, 81 insertions(+), 83 deletions(-)

diff --git a/doc/examples/ex-client-srp.c b/doc/examples/ex-client-srp.c
index 2ec86d4..7784075 100644
--- a/doc/examples/ex-client-srp.c
+++ b/doc/examples/ex-client-srp.c
@@ -82,7 +82,7 @@ main (void)
   gnutls_record_send (session, MSG, strlen (MSG));
 
   ret = gnutls_record_recv (session, buffer, MAX_BUF);
-  if (gnutls_error_is_fatal (ret) == 1 || ret == 0)
+  if (gnutls_error_is_fatal (ret) != 0 || ret == 0)
     {
       if (ret == 0)
         {
diff --git a/lib/gnutls_dtls.c b/lib/gnutls_dtls.c
index f6dcfac..6669064 100644
--- a/lib/gnutls_dtls.c
+++ b/lib/gnutls_dtls.c
@@ -157,9 +157,13 @@ int ret;
 
 }
 
-#define UPDATE_TIMER \
+#define UPDATE_TIMER { \
       session->internals.dtls.actual_retrans_timeout_ms *= 2; \
-      session->internals.dtls.actual_retrans_timeout_ms %= MAX_DTLS_TIMEOUT
+      session->internals.dtls.actual_retrans_timeout_ms %= MAX_DTLS_TIMEOUT; \
+    }
+
+#define RESET_TIMER \
+      session->internals.dtls.actual_retrans_timeout_ms = 
session->internals.dtls.retrans_timeout_ms
 
 /* This function transmits the flight that has been previously
  * buffered.
@@ -172,6 +176,7 @@ _dtls_transmit (gnutls_session_t session)
 {
 int ret;
 uint8_t* buf = NULL;
+unsigned int timeout;
 
   /* PREPARING -> SENDING state transition */
   mbuffer_head_st *const send_buffer =
@@ -184,13 +189,17 @@ uint8_t* buf = NULL;
    * non blocking way, check if it is time to retransmit or just
    * return.
    */
-
   if (session->internals.dtls.flight_init != 0 && 
session->internals.dtls.blocking == 0)
     {
       /* just in case previous run was interrupted */
       ret = _gnutls_io_write_flush (session);
+      if (ret < 0)
+        {
+          gnutls_assert();
+          goto cleanup;
+        }
 
-      if (session->internals.dtls.last_flight == 0)
+      if (session->internals.dtls.last_flight == 0 || !_dtls_is_async(session))
         {
           /* check for ACK */
           ret = _gnutls_io_check_recv(session, 0);
@@ -198,8 +207,8 @@ uint8_t* buf = NULL;
             {
               /* if no retransmission is required yet just return 
                */
-              if (now-session->internals.dtls.handshake_start_time < 
-                  session->internals.dtls.actual_retrans_timeout_ms/1000)
+              if (1000*(now-session->internals.dtls.handshake_start_time) < 
+                  session->internals.dtls.actual_retrans_timeout_ms)
                 {
                   session->internals.dtls.handshake_last_call = now;
                   goto nb_timeout;
@@ -215,55 +224,49 @@ uint8_t* buf = NULL;
 
   do 
     {
-      if (now-session->internals.dtls.handshake_start_time >= 
session->internals.dtls.total_timeout_ms/1000) 
+      if (1000*(now-session->internals.dtls.handshake_start_time) >= 
session->internals.dtls.total_timeout_ms) 
         {
           ret = gnutls_assert_val(GNUTLS_E_TIMEDOUT);
           goto cleanup;
         }
-        
-      if ((session->internals.dtls.flight_init == 0) ||
-          (now - session->internals.dtls.last_retransmit > RETRANSMIT_WINDOW))
-        {
-          session->internals.dtls.last_retransmit = now;
 
-          _gnutls_dtls_log ("DTLS[%p]: %sStart of flight transmission.\n", 
session,  (session->internals.dtls.flight_init == 0)?"":"re-");
+      _gnutls_dtls_log ("DTLS[%p]: %sStart of flight transmission.\n", 
session,  (session->internals.dtls.flight_init == 0)?"":"re-");
 
-          for (cur = send_buffer->head;
-               cur != NULL; cur = cur->next)
+      for (cur = send_buffer->head;
+           cur != NULL; cur = cur->next)
+        {
+          ret = transmit_message (session, cur, &buf);
+          if (ret < 0)
             {
-              ret = transmit_message (session, cur, &buf);
-              if (ret < 0)
-                {
-                  gnutls_assert();
-                  goto cleanup;
-                }
-
-              last_type = cur->htype;
+              gnutls_assert();
+              goto cleanup;
             }
 
-          if (buf != NULL)
-            {
-              gnutls_free(buf);
-              buf = NULL;
-            }
+          last_type = cur->htype;
+        }
 
-          if (session->internals.dtls.flight_init == 0)
-            {
-              session->internals.dtls.flight_init = 1;
-              session->internals.dtls.handshake_last_call = now;
-              session->internals.dtls.actual_retrans_timeout_ms = 
session->internals.dtls.retrans_timeout_ms;
+      if (session->internals.dtls.flight_init == 0)
+        {
+          session->internals.dtls.flight_init = 1;
+          session->internals.dtls.handshake_last_call = now;
+          RESET_TIMER;
+          timeout = session->internals.dtls.actual_retrans_timeout_ms;
 
-              if (last_type == GNUTLS_HANDSHAKE_FINISHED)
-                {
-                  /* On the last flight we cannot ensure retransmission
-                   * from here. _dtls_wait_and_retransmit() is being called
-                   * by handshake.
-                   */
-                  session->internals.dtls.last_flight = 1;
-                }
-              else
-                session->internals.dtls.last_flight = 0;
-           }
+          if (last_type == GNUTLS_HANDSHAKE_FINISHED)
+            {
+              /* On the last flight we cannot ensure retransmission
+               * from here. _dtls_wait_and_retransmit() is being called
+               * by handshake.
+               */
+              session->internals.dtls.last_flight = 1;
+            }
+          else
+            session->internals.dtls.last_flight = 0;
+        }
+      else
+        {
+          timeout = session->internals.dtls.actual_retrans_timeout_ms;
+          UPDATE_TIMER;
         }
 
       ret = _gnutls_io_write_flush (session);
@@ -283,19 +286,17 @@ uint8_t* buf = NULL;
       else /* all other messages -> implicit ack (receive of next flight) */
         {
           if (session->internals.dtls.blocking != 0)
-            ret = _gnutls_io_check_recv(session, 
session->internals.dtls.actual_retrans_timeout_ms);
+            ret = _gnutls_io_check_recv(session, timeout);
           else
             {
               ret = _gnutls_io_check_recv(session, 0);
               if (ret == GNUTLS_E_TIMEDOUT)
                 {
-                  UPDATE_TIMER;
                   goto nb_timeout;
                 }
             }
         }
 
-      UPDATE_TIMER;
       now = gnutls_time (0);
     } while(ret == GNUTLS_E_TIMEDOUT);
 
@@ -320,6 +321,9 @@ cleanup:
   return ret;
 
 nb_timeout:
+  if (buf != NULL)
+    gnutls_free(buf);
+
   RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
 }
 
@@ -335,8 +339,6 @@ int ret;
   else
     ret = _gnutls_io_check_recv(session, 0);
 
-  UPDATE_TIMER;
-      
   if (ret == GNUTLS_E_TIMEDOUT)
     {
       ret = _dtls_retransmit(session);
@@ -344,6 +346,8 @@ int ret;
         {
           RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
         }
+      else
+        return gnutls_assert_val(ret);
     }
 
   return 0;
@@ -404,28 +408,19 @@ unsigned int i, offset = 0;
       if (diff >= window_size) 
         {
           /* Probably an epoch change. Check if we can fit it */
-          if (window_table[0] == 0)
+          if (window_table[0] == 0 || window_table[0]+1 == seq)
             {
               window_table[0] = seq;
               return 0;
             }
           
-          for (i=0;i<window_size-1;i++)
-            {
-              if (seq == window_table[i])
-                return -1;
-              if (seq == window_table[i] + 1)
-                {
-                  if (seq == window_table[i+1])
-                    return -1;
-                  window_table[i+1] = seq;
-                  return 0;
-                }
-            }
-          return -1;
-        }
+          if ((window_size-2)/2 < 2)
+            return -1;
 
-      offset = window_size-1-diff;
+          offset = 1 + seq % ((window_size-2)/2);
+        }
+      else
+        offset = window_size-1-diff;
 
       if (window_table[offset] == seq)
         return -1;
diff --git a/lib/gnutls_record.c b/lib/gnutls_record.c
index a7008c0..d55fb04 100644
--- a/lib/gnutls_record.c
+++ b/lib/gnutls_record.c
@@ -678,7 +678,11 @@ record_add_to_buffers (gnutls_session_t session,
               if (_dtls_is_async(session) && _dtls_async_timer_active(session))
                 {
                   ret = _dtls_retransmit(session);
-                  if (ret == 0) ret = GNUTLS_E_AGAIN;
+                  if (ret == 0) 
+                    {
+                      ret = gnutls_assert_val(GNUTLS_E_AGAIN);
+                      goto unexpected_packet;
+                    }
                   goto cleanup;
                 }
             }
@@ -861,9 +865,9 @@ gnutls_datum_t raw; /* raw headers */
     {
       if (_gnutls_epoch_is_valid(session, record->epoch) == 0)
         {
-          _gnutls_audit_log(session, "Discarded message[%u] with invalid epoch 
0x%.2x%.2x.\n",
-            (unsigned int)_gnutls_uint64touint32 (&record->sequence), 
(int)record->sequence.i[0], 
-            (int)record->sequence.i[1]);
+          _gnutls_audit_log(session, "Discarded message[%u] with invalid epoch 
%u.\n",
+            (unsigned int)_gnutls_uint64touint32 (&record->sequence), 
+            (unsigned int)record->sequence.i[0]*256+(unsigned 
int)record->sequence.i[1]);
           gnutls_assert();
           /* doesn't matter, just a fatal error */
           return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
@@ -1024,12 +1028,19 @@ begin:
             (unsigned int) _gnutls_uint64touint32 (packet_sequence), 
_gnutls_packet2str (record.type));
           goto sanity_check_error;
         }
+      _gnutls_record_log
+        ("REC[%p]: Decrypted Packet[%u.%u] %s(%d) with length: %d\n", session,
+        (unsigned int)record.sequence.i[0]*256 +(unsigned 
int)record.sequence.i[1],
+        (unsigned int) _gnutls_uint64touint32 (packet_sequence),
+        _gnutls_packet2str (record.type), record.type, 
(int)_mbuffer_get_udata_size(decrypted));
+    }
+  else
+    {
+      _gnutls_record_log
+        ("REC[%p]: Decrypted Packet[%u] %s(%d) with length: %d\n", session,
+        (unsigned int) _gnutls_uint64touint32 (packet_sequence),
+        _gnutls_packet2str (record.type), record.type, 
(int)_mbuffer_get_udata_size(decrypted));
     }
-
-  _gnutls_record_log
-    ("REC[%p]: Decrypted Packet[%d] %s(%d) with length: %d\n", session,
-     (int) _gnutls_uint64touint32 (packet_sequence),
-     _gnutls_packet2str (record.type), record.type, 
(int)_mbuffer_get_udata_size(decrypted));
 
   /* increase sequence number 
    */
diff --git a/lib/system.c b/lib/system.c
index 476b313..0829759 100644
--- a/lib/system.c
+++ b/lib/system.c
@@ -111,12 +111,6 @@ system_read (gnutls_transport_ptr_t ptr, void *data, 
size_t data_size)
   return recv (GNUTLS_POINTER_TO_INT (ptr), data, data_size, 0);
 }
 
-ssize_t
-system_read_peek (gnutls_transport_ptr_t ptr, void *data, size_t data_size)
-{
-  return recv (GNUTLS_POINTER_TO_INT (ptr), data, data_size, MSG_PEEK);
-}
-
 /* Wait for data to be received within a timeout period in milliseconds.
  * If data_size > 0 it will return the specified amount of data in
  * peek mode.
diff --git a/lib/system.h b/lib/system.h
index 0d2f5a5..0178bd5 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -43,8 +43,6 @@ ssize_t system_writev (gnutls_transport_ptr_t ptr, const 
giovec_t * iovec,
                        int iovec_cnt);
 #endif
 ssize_t system_read (gnutls_transport_ptr_t ptr, void *data, size_t data_size);
-ssize_t system_read_peek (gnutls_transport_ptr_t ptr, void *data,
-                          size_t data_size);
 
 #ifdef _WIN32
 #define HAVE_WIN32_LOCKS


hooks/post-receive
-- 
GNU gnutls



reply via email to

[Prev in Thread] Current Thread [Next in Thread]