From: Nikos Mavrogiannopoulos Date: Thu, 10 Mar 2011 22:58:27 +0000 (+0100) Subject: Corrected behavior in normal TLS handshake. X-Git-Tag: gnutls_2_99_0~147 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ec62cab9b92cbb29f09cf237cdfc8dcec5b07aac;p=thirdparty%2Fgnutls.git Corrected behavior in normal TLS handshake. --- diff --git a/lib/gnutls_buffers.c b/lib/gnutls_buffers.c index c8ad1dc270..55a7665437 100644 --- a/lib/gnutls_buffers.c +++ b/lib/gnutls_buffers.c @@ -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 diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c index d8dcea4c31..6b7f1d3f69 100644 --- a/lib/gnutls_handshake.c +++ b/lib/gnutls_handshake.c @@ -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; }