@@ -3229,7 +3229,6 @@ int mbedtls_ssl_prepare_handshake_record(mbedtls_ssl_context *ssl)
32293229 if (ssl -> in_hslen == 0 ) {
32303230 ssl -> in_hslen = mbedtls_ssl_hs_hdr_len (ssl ) + ssl_get_hs_total_len (ssl );
32313231 ssl -> in_hsfraglen = 0 ;
3232- ssl -> in_hshdr = ssl -> in_hdr ;
32333232 }
32343233
32353234 MBEDTLS_SSL_DEBUG_MSG (3 , ("handshake message: msglen ="
@@ -3296,10 +3295,7 @@ int mbedtls_ssl_prepare_handshake_record(mbedtls_ssl_context *ssl)
32963295 }
32973296 } else
32983297#endif /* MBEDTLS_SSL_PROTO_DTLS */
3299- {
3300- if (ssl -> in_hsfraglen > ssl -> in_hslen ) {
3301- return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
3302- }
3298+ if (ssl -> in_hsfraglen <= ssl -> in_hslen ) {
33033299 int ret ;
33043300 const size_t hs_remain = ssl -> in_hslen - ssl -> in_hsfraglen ;
33053301 MBEDTLS_SSL_DEBUG_MSG (3 ,
@@ -3317,15 +3313,16 @@ int mbedtls_ssl_prepare_handshake_record(mbedtls_ssl_context *ssl)
33173313 mbedtls_ssl_update_in_pointers (ssl );
33183314 return MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ;
33193315 }
3320- if (ssl -> in_hshdr != ssl -> in_hdr ) {
3316+ if (ssl -> in_hsfraglen > 0 ) {
33213317 /*
3322- * At ssl->in_hshdr we have a sequence of records that cover the next handshake
3318+ * At in_first_hdr we have a sequence of records that cover the next handshake
33233319 * record, each with its own record header that we need to remove.
33243320 * Note that the reassembled record size may not equal the size of the message,
3325- * there maybe bytes from the next message following it .
3321+ * there may be more messages after it, complete or partial .
33263322 */
3323+ unsigned char * in_first_hdr = ssl -> in_buf + MBEDTLS_SSL_SEQUENCE_NUMBER_LEN ;
3324+ unsigned char * p = in_first_hdr , * q = NULL ;
33273325 size_t merged_rec_len = 0 ;
3328- unsigned char * p = ssl -> in_hshdr , * q = NULL ;
33293326 do {
33303327 mbedtls_record rec ;
33313328 ret = ssl_parse_record_header (ssl , p , mbedtls_ssl_in_hdr_len (ssl ), & rec );
@@ -3341,16 +3338,17 @@ int mbedtls_ssl_prepare_handshake_record(mbedtls_ssl_context *ssl)
33413338 q = p ;
33423339 }
33433340 } while (merged_rec_len < ssl -> in_hslen );
3344- ssl -> in_hdr = ssl -> in_hshdr ;
3341+ ssl -> in_hdr = in_first_hdr ;
33453342 mbedtls_ssl_update_in_pointers (ssl );
33463343 ssl -> in_msglen = merged_rec_len ;
33473344 /* Adjust message length. */
33483345 MBEDTLS_PUT_UINT16_BE (merged_rec_len , ssl -> in_len , 0 );
33493346 ssl -> in_hsfraglen = 0 ;
3350- ssl -> in_hshdr = NULL ;
33513347 MBEDTLS_SSL_DEBUG_BUF (4 , "reassembled record" ,
33523348 ssl -> in_hdr , mbedtls_ssl_in_hdr_len (ssl ) + merged_rec_len );
33533349 }
3350+ } else {
3351+ return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
33543352 }
33553353
33563354 return 0 ;
0 commit comments