From 0439ee14301683e876cfd37b0b0e5e7237a35a49 Mon Sep 17 00:00:00 2001 From: kkent030315 Date: Sat, 14 Jun 2025 21:50:03 +0900 Subject: [PATCH] PE: fix TLS raw data parser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Jorge Alejandro DurĂ¡n Royo --- src/pe/tls.rs | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/src/pe/tls.rs b/src/pe/tls.rs index 400443b0..3d5a2c63 100644 --- a/src/pe/tls.rs +++ b/src/pe/tls.rs @@ -219,30 +219,15 @@ impl<'a> TlsData<'a> { // VA to RVA let rva = itd.start_address_of_raw_data - image_base; let size = itd.end_address_of_raw_data - itd.start_address_of_raw_data; - let offset = utils::find_offset(rva as usize, sections, file_alignment, opts) - .ok_or_else(|| { - error::Error::Malformed(format!( - "cannot map tls start_address_of_raw_data rva ({:#x}) into offset", - rva - )) - })?; - - let offset_end = offset.checked_add(size as usize).ok_or_else(|| { - error::Error::Malformed(format!( - "tls start_address_of_raw_data ({:#x}) + size_of_raw_data ({:#x}) casues an integer overflow", - offset, size - )) - })?; + let offset = utils::find_offset(rva as usize, sections, file_alignment, opts); - if offset > bytes.len() || offset_end > bytes.len() { - return Err(error::Error::Malformed(format!( - "tls raw data offset ({:#x}) and size ({:#x}) greater than byte slice len ({:#x})", - offset, - size, - bytes.len() - ))); - } - raw_data = Some(&bytes[offset..offset + size as usize]); + raw_data = offset.and_then(|offset| { + if offset < bytes.len() { + (&bytes[offset..]).pread_with(0, size as usize).ok() + } else { + None + } + }); } // Parse the index if any