diff --git a/symbolic-debuginfo/src/pe.rs b/symbolic-debuginfo/src/pe.rs index a56668fed..26118b0e8 100644 --- a/symbolic-debuginfo/src/pe.rs +++ b/symbolic-debuginfo/src/pe.rs @@ -3,9 +3,7 @@ use std::borrow::Cow; use std::error::Error; use std::fmt; -use std::fs::File; -use std::io::BufWriter; -use std::io::Read; +use std::io::Write; use gimli::RunTimeEndian; use goblin::pe; @@ -505,31 +503,14 @@ impl<'data, 'object> PeEmbeddedPortablePDB<'data> { self.uncompressed_size } - /// Reads the Portable PDB contents into the provided vector. - pub fn decompress_to_vec(&self) -> Result, PeError> { - let mut decoder = flate2::read::DeflateDecoder::new(self.compressed_data); - let mut output: Vec = vec![0; self.uncompressed_size]; - let read_size = decoder.read(&mut output).map_err(PeError::new)?; - if read_size != self.uncompressed_size { - return Err(PeError::new(symbolic_ppdb::FormatError::from( - symbolic_ppdb::FormatErrorKind::InvalidLength, - ))); - } - Ok(output) - } - - /// Reads the Portable PDB contents into the provided file. - pub fn decompress_to_file(&self, output: File) -> Result { + /// Reads the Portable PDB contents into the writer. + pub fn decompress_to(&self, output: W) -> Result<(), PeError> { use std::io::prelude::*; - let buf_writer = BufWriter::new(output); - let mut decoder = flate2::write::DeflateDecoder::new(buf_writer); + let mut decoder = flate2::write::DeflateDecoder::new(output); decoder .write_all(self.compressed_data) .map_err(PeError::new)?; - decoder - .finish() - .map_err(PeError::new)? - .into_inner() - .map_err(PeError::new) + decoder.finish().map_err(PeError::new)?; + Ok(()) } } diff --git a/symbolic-debuginfo/tests/test_objects.rs b/symbolic-debuginfo/tests/test_objects.rs index cff76a8dc..dcfd3797c 100644 --- a/symbolic-debuginfo/tests/test_objects.rs +++ b/symbolic-debuginfo/tests/test_objects.rs @@ -1,4 +1,4 @@ -use std::{env, ffi::CString, fmt}; +use std::{env, ffi::CString, fmt, io::BufWriter}; use symbolic_common::ByteView; use symbolic_debuginfo::{ @@ -565,11 +565,12 @@ fn test_pe_embedded_ppdb() -> Result<(), Error> { let embedded_ppdb = pe.embedded_ppdb().unwrap().unwrap(); assert_eq!(embedded_ppdb.get_size(), 10540); - let buf = embedded_ppdb.decompress_to_vec()?; + let mut buf = Vec::new(); + embedded_ppdb.decompress_to(&mut buf)?; assert_eq!(&buf[15..25], "\0PDB v1.0\0".as_bytes()); let tmp_file = tempfile::tempfile()?; - let tmp_file = embedded_ppdb.decompress_to_file(tmp_file)?; + embedded_ppdb.decompress_to(BufWriter::new(&tmp_file))?; let file_buf = ByteView::map_file(tmp_file)?; assert_eq!(buf, file_buf.as_slice()); } diff --git a/symbolic-ppdb/tests/test_ppdb.rs b/symbolic-ppdb/tests/test_ppdb.rs index 0dc76c7df..1e5e6da47 100644 --- a/symbolic-ppdb/tests/test_ppdb.rs +++ b/symbolic-ppdb/tests/test_ppdb.rs @@ -109,7 +109,8 @@ fn test_pe_embedded_ppdb_without_sources() { let pe = PeObject::parse(&pe_buf).unwrap(); let embedded_ppdb = pe.embedded_ppdb().unwrap().unwrap(); - let ppdb_buf = embedded_ppdb.decompress_to_vec().unwrap(); + let mut ppdb_buf = Vec::new(); + embedded_ppdb.decompress_to(&mut ppdb_buf).unwrap(); let ppdb = PortablePdb::parse(&ppdb_buf).unwrap(); assert_eq!(ppdb.pdb_id().unwrap(), pe.debug_id()); @@ -128,7 +129,8 @@ fn test_pe_embedded_ppdb_with_sources() { let pe = PeObject::parse(&pe_buf).unwrap(); let embedded_ppdb = pe.embedded_ppdb().unwrap().unwrap(); - let ppdb_buf = embedded_ppdb.decompress_to_vec().unwrap(); + let mut ppdb_buf = Vec::new(); + embedded_ppdb.decompress_to(&mut ppdb_buf).unwrap(); let ppdb = PortablePdb::parse(&ppdb_buf).unwrap(); assert_eq!(ppdb.pdb_id().unwrap(), pe.debug_id());