diff --git a/libcore/src/terrapipe.rs b/libcore/src/terrapipe.rs index b94cc980..cab9c90e 100644 --- a/libcore/src/terrapipe.rs +++ b/libcore/src/terrapipe.rs @@ -355,13 +355,22 @@ pub fn parse_result_packet( Err(_) => return Err(UnrecognizedError(metaframe[4].to_owned())), }; + let respsize = match metaframe[4].parse::() { + Ok(r) => r, + Err(_) => return Err(StandardError(TPError::InvalidMetaframe)), + }; + if let Some(respcode) = TPError::from_u8(respcode) { match respcode { - Okay => { + TPError::Okay => { // Enter dataframe and check result if let Some(value) = dataframe.get(0) { if dataframe.get(1).is_none() { - return Ok(value.to_string()); + if value.len() == respsize { + return Ok(value.to_string()); + } else { + return Err(StandardError(TPError::CorruptDataframe)); + } } else { return Err(StandardError(TPError::CorruptDataframe)); } @@ -464,3 +473,42 @@ fn test_qpacket_error() { eq_corrupt_df ); } + +#[cfg(test)] +#[test] +fn test_rpacket_error() { + let v = Version(0, 1, 0); + use TPResultError::*; + let bad_tp_tag = "AP/0.1.0/R/5\n\nsayan".to_owned(); + let bad_version = "TP/0.1/R/0/5\n\nsayan".to_owned(); + let bad_mf_r_tag = "TP/0.1.0/X/0/5\n\nsayan".to_owned(); + let bad_mf_no_size = "TP/0.1.0/R/0\n\nsayan".to_owned(); + let bad_df = "TP/0.1.0/R/0/5\n\n".to_owned(); + let bad_df_size = "TP/0.1.0/0/4\n\nsaya".to_owned(); + let err_invalid_mf = StandardError(TPError::InvalidMetaframe); + let err_corrupt_df = StandardError(TPError::CorruptDataframe); + assert_eq!( + parse_result_packet(&bad_tp_tag, &v).err().unwrap(), + err_invalid_mf + ); + assert_eq!( + parse_result_packet(&bad_version, &v).err().unwrap(), + err_invalid_mf + ); + assert_eq!( + parse_result_packet(&bad_mf_r_tag, &v).err().unwrap(), + err_invalid_mf + ); + assert_eq!( + parse_result_packet(&bad_mf_no_size, &v).err().unwrap(), + err_invalid_mf + ); + assert_eq!( + parse_result_packet(&bad_df, &v).err().unwrap(), + err_corrupt_df + ); + assert_eq!( + parse_result_packet(&bad_df_size, &v).err().unwrap(), + err_invalid_mf + ); +}