@@ -82,11 +82,12 @@ memarray_t dtlscontext_storage;
8282
8383#define dtls_set_version (H ,V ) dtls_int_to_uint16((H)->version, (V))
8484#define dtls_set_content_type (H ,V ) ((H)->content_type = (V) & 0xff)
85- #define dtls_set_length (H ,V ) (( H)->length = (V))
85+ #define dtls_set_length (H ,V ) dtls_int_to_uint16(&(( H)->length), (V))
8686
8787#define dtls_get_content_type (H ) ((H)->content_type & 0xff)
8888#define dtls_get_version (H ) dtls_uint16_to_int((H)->version)
8989#define dtls_get_epoch (H ) dtls_uint16_to_int((H)->epoch)
90+ #define dtls_get_length (H ) dtls_uint16_to_int((H)->length)
9091#define dtls_get_sequence_number (H ) dtls_uint48_to_ulong((H)->sequence_number)
9192#define dtls_get_fragment_length (H ) dtls_uint24_to_int((H)->fragment_length)
9293
@@ -563,15 +564,30 @@ is_record(uint8 *msg, size_t msglen) {
563564 unsigned int rlen = 0 ;
564565
565566 if (msglen >= DTLS_RH_LENGTH ) { /* FIXME allow empty records? */
566- uint16_t version = dtls_uint16_to_int (msg + 1 );
567- if ((((version == DTLS_VERSION ) || (version == DTLS10_VERSION ))
568- && known_content_type (msg ))) {
569- rlen = DTLS_RH_LENGTH +
570- dtls_uint16_to_int (DTLS_RECORD_HEADER (msg )-> length );
571-
572- /* we do not accept wrong length field in record header */
573- if (rlen > msglen )
574- rlen = 0 ;
567+ uint16_t version = dtls_get_version (DTLS_RECORD_HEADER (msg ));
568+
569+ if (DTLS_VERSION == version ) {
570+ if (!known_content_type (msg )) {
571+ return 0 ;
572+ }
573+ } else if (DTLS10_VERSION == version ) {
574+ if (DTLS_CT_HANDSHAKE != msg [0 ] || DTLS_RH_LENGTH == msglen ) {
575+ return 0 ;
576+ } else {
577+ uint8_t handshake_type = msg [DTLS_RH_LENGTH ];
578+ if (DTLS_HT_CLIENT_HELLO != handshake_type &&
579+ DTLS_HT_HELLO_VERIFY_REQUEST != handshake_type ) {
580+ return 0 ;
581+ }
582+ }
583+ } else {
584+ return 0 ;
585+ }
586+ rlen = DTLS_RH_LENGTH + dtls_uint16_to_int (DTLS_RECORD_HEADER (msg )-> length );
587+
588+ /* we do not accept wrong length field in record header */
589+ if (rlen > msglen ) {
590+ rlen = 0 ;
575591 }
576592 }
577593
0 commit comments