]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Corrected behavior in normal TLS handshake.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 10 Mar 2011 22:58:27 +0000 (23:58 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 10 Mar 2011 22:58:27 +0000 (23:58 +0100)
lib/gnutls_buffers.c
lib/gnutls_handshake.c

index c8ad1dc270dc750c05fe0e24dfaf98737c567cf7..55a7665437b2954d32a3d5b15b573ddc214a0630 100644 (file)
@@ -1008,7 +1008,10 @@ handshake_buffer_st* recv_buf = session->internals.handshake_recv_buffer;
         return gnutls_assert_val(GNUTLS_E_AGAIN);
 
       if (htype != recv_buf[LAST_ELEMENT].htype)
-        return gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
+        {
+          hsk->htype = recv_buf[LAST_ELEMENT].htype;
+          return gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
+        }
 
       else if ((recv_buf[LAST_ELEMENT].start_offset == 0 &&
         recv_buf[LAST_ELEMENT].end_offset == recv_buf[LAST_ELEMENT].length -1) || 
@@ -1017,7 +1020,6 @@ handshake_buffer_st* recv_buf = session->internals.handshake_recv_buffer;
           session->internals.dtls.hsk_read_seq++;
           _gnutls_handshake_buffer_move(hsk, &recv_buf[LAST_ELEMENT]);
           session->internals.handshake_recv_buffer_size--;
-
           return 0;
         }
       else
@@ -1027,11 +1029,18 @@ handshake_buffer_st* recv_buf = session->internals.handshake_recv_buffer;
     {
       if (session->internals.handshake_recv_buffer_size > 0 && recv_buf[0].length == recv_buf[0].data.length)
         {
+          if (recv_buf[0].htype != htype)
+            {
+              hsk->htype = recv_buf[LAST_ELEMENT].htype;
+              return gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
+            }
+
           _gnutls_handshake_buffer_move(hsk, &recv_buf[0]);
+          session->internals.handshake_recv_buffer_size--;
           return 0;
         }
       else
-        return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
+        return gnutls_assert_val(GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE);
     }
 }
 
@@ -1078,7 +1087,7 @@ _gnutls_handshake_io_recv_int (gnutls_session_t session,
                 recv_buf[0].data.length;
 
           /* this is the rest of a previous message */
-          if (recv_buf[0].length > 0 && remain > 0)
+          if (session->internals.handshake_recv_buffer_size > 0 && recv_buf[0].length > 0 && remain > 0)
             {
               if (msg.size <= remain)
                 append = msg.size;
@@ -1100,11 +1109,6 @@ _gnutls_handshake_io_recv_int (gnutls_session_t session,
               header_size = ret;
               session->internals.handshake_recv_buffer_size = 1;
 
-              if (htype != recv_buf[0].htype)
-                { /* an unexpected packet */
-                  return gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
-                }
-
               _mbuffer_set_uhead_size(bufel, header_size);
 
               data_size = MIN(recv_buf[0].length, _mbuffer_get_udata_size(bufel));
@@ -1113,6 +1117,13 @@ _gnutls_handshake_io_recv_int (gnutls_session_t session,
                 return gnutls_assert_val(ret);
 
               _mbuffer_head_remove_bytes(&session->internals.record_buffer, data_size+header_size);
+
+              if (htype != recv_buf[0].htype)
+                { /* an unexpected packet */
+                  hsk->htype = recv_buf[0].htype;
+                  return gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
+                }
+
             }
 
           /* if packet is complete then return it
index d8dcea4c313b36b4dbf9b7ad108c40777e6571d7..6b7f1d3f69c155c7264878701f8ed781969a87a1 100644 (file)
@@ -1354,6 +1354,10 @@ _gnutls_recv_handshake (gnutls_session_t session,
           if (buf) _gnutls_buffer_init(buf);
           return 0;
         }
+
+       _gnutls_audit_log("Received unexpected handshake message '%s' (%d). Expected '%s' (%d)\n",
+         _gnutls_handshake2str(hsk.htype), (int)hsk.htype, _gnutls_handshake2str(type), (int)type);
+
       return gnutls_assert_val(ret);
     }
 
@@ -1430,6 +1434,9 @@ _gnutls_recv_handshake (gnutls_session_t session,
       break;
     default:
       gnutls_assert ();
+      /* we shouldn't actually arrive here in any case .
+       * unexpected messages should be catched after _gnutls_handshake_io_recv_int()
+       */
       ret = GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET;
       goto cleanup;
     }