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) ||
session->internals.dtls.hsk_read_seq++;
_gnutls_handshake_buffer_move(hsk, &recv_buf[LAST_ELEMENT]);
session->internals.handshake_recv_buffer_size--;
-
return 0;
}
else
{
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);
}
}
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;
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));
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
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);
}
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;
}