From e300c3dcf711a5b777b7203393bc04a3c368cd15 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Fri, 8 Jul 2022 09:21:46 +0100 Subject: [PATCH] vhdx: Avoid unwrap() of invalid header In the original code: If the first header was invalid and the second header had the same sequence number (zero) then the invalid first header would be returned. The new code is more Rust idiomatic and avoids this situation. See: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=48858 Signed-off-by: Rob Bradford --- vhdx/src/vhdx_header.rs | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/vhdx/src/vhdx_header.rs b/vhdx/src/vhdx_header.rs index 476067c0d..09697bbc4 100644 --- a/vhdx/src/vhdx_header.rs +++ b/vhdx/src/vhdx_header.rs @@ -397,26 +397,20 @@ impl VhdxHeader { header_1: Result
, header_2: Result
, ) -> Result<(HeaderNo, Header)> { - let mut header1_seq_num: u64 = 0; - let mut header2_seq_num: u64 = 0; - let mut valid_hdr_found: bool = false; + let header_1 = header_1.ok(); + let header_2 = header_2.ok(); - if let Ok(ref header_1) = header_1 { - valid_hdr_found = true; - header1_seq_num = header_1.sequence_number; - } - - if let Ok(ref header_2) = header_2 { - valid_hdr_found = true; - header2_seq_num = header_2.sequence_number; - } - - if !valid_hdr_found { - Err(VhdxHeaderError::NoValidHeader) - } else if header1_seq_num >= header2_seq_num { - Ok((HeaderNo::First, header_1.unwrap())) - } else { - Ok((HeaderNo::Second, header_2.unwrap())) + match (header_1, header_2) { + (None, None) => Err(VhdxHeaderError::NoValidHeader), + (Some(header_1), None) => Ok((HeaderNo::First, header_1)), + (None, Some(header_2)) => Ok((HeaderNo::Second, header_2)), + (Some(header_1), Some(header_2)) => { + if header_1.sequence_number >= header_2.sequence_number { + Ok((HeaderNo::First, header_1)) + } else { + Ok((HeaderNo::Second, header_2)) + } + } } }