@@ -537,26 +537,42 @@ pub fn handle_exchange_mig_attest_info_req(
537537        . map_err ( |_| SPDM_STATUS_BUFFER_FULL ) ?; 
538538
539539    //quote dst 
540+     let  quote_len = quote_dst. len ( ) ; 
541+     let  quote_len_u16 = match  u16:: try_from ( quote_len)  { 
542+         Ok ( v)  => v, 
543+         Err ( _)  => return  Err ( SPDM_STATUS_BUFFER_FULL ) , 
544+     } ; 
540545    let  quote_element = VdmMessageElement  { 
541546        element_type :  VdmMessageElementType :: QuoteMy , 
542-         length :  quote_dst . len ( )   as   u16 , 
547+         length :  quote_len_u16 , 
543548    } ; 
544549    cnt += quote_element
545550        . encode ( & mut  writer) 
546551        . map_err ( |_| SPDM_STATUS_BUFFER_FULL ) ?; 
552+     if  writer. used ( ) . checked_add ( quote_len) . is_none ( )  { 
553+         return  Err ( SPDM_STATUS_BUFFER_FULL ) ; 
554+     } 
547555    cnt += writer
548556        . extend_from_slice ( quote_dst. as_slice ( ) ) 
549557        . ok_or ( SPDM_STATUS_BUFFER_FULL ) ?; 
550558
551559    //event log dst 
552560    let  event_log_dst = get_event_log ( ) . ok_or ( SPDM_STATUS_INVALID_STATE_LOCAL ) ?; 
561+     let  event_log_len = event_log_dst. len ( ) ; 
562+     let  event_log_len_u16 = match  u16:: try_from ( event_log_len)  { 
563+         Ok ( v)  => v, 
564+         Err ( _)  => return  Err ( SPDM_STATUS_BUFFER_FULL ) , 
565+     } ; 
553566    let  event_log_element = VdmMessageElement  { 
554567        element_type :  VdmMessageElementType :: EventLogMy , 
555-         length :  event_log_dst . len ( )   as   u16 , 
568+         length :  event_log_len_u16 , 
556569    } ; 
557570    cnt += event_log_element
558571        . encode ( & mut  writer) 
559572        . map_err ( |_| SPDM_STATUS_BUFFER_FULL ) ?; 
573+     if  writer. used ( ) . checked_add ( event_log_len) . is_none ( )  { 
574+         return  Err ( SPDM_STATUS_BUFFER_FULL ) ; 
575+     } 
560576    cnt += writer
561577        . extend_from_slice ( event_log_dst) 
562578        . ok_or ( SPDM_STATUS_BUFFER_FULL ) ?; 
@@ -565,13 +581,21 @@ pub fn handle_exchange_mig_attest_info_req(
565581    let  mig_policy_dst = get_policy ( ) . ok_or ( SPDM_STATUS_INVALID_STATE_LOCAL ) ?; 
566582    let  mig_policy_dst_hash =
567583        digest_sha384 ( mig_policy_dst) . map_err ( |_| SPDM_STATUS_CRYPTO_ERROR ) ?; 
584+     let  mig_policy_len = mig_policy_dst_hash. len ( ) ; 
585+     let  mig_policy_len_u16 = match  u16:: try_from ( mig_policy_len)  { 
586+         Ok ( v)  => v, 
587+         Err ( _)  => return  Err ( SPDM_STATUS_BUFFER_FULL ) , 
588+     } ; 
568589    let  mig_policy_element = VdmMessageElement  { 
569590        element_type :  VdmMessageElementType :: MigPolicyMy , 
570-         length :  mig_policy_dst_hash . len ( )   as   u16 , 
591+         length :  mig_policy_len_u16 , 
571592    } ; 
572593    cnt += mig_policy_element
573594        . encode ( & mut  writer) 
574595        . map_err ( |_| SPDM_STATUS_BUFFER_FULL ) ?; 
596+     if  writer. used ( ) . checked_add ( mig_policy_len) . is_none ( )  { 
597+         return  Err ( SPDM_STATUS_BUFFER_FULL ) ; 
598+     } 
575599    cnt += writer
576600        . extend_from_slice ( & mig_policy_dst_hash) 
577601        . ok_or ( SPDM_STATUS_BUFFER_FULL ) ?; 
0 commit comments