diff --git a/libraries/libarchive/src/error.rs b/libraries/libarchive/src/error.rs index 7d22effb..1479f21f 100644 --- a/libraries/libarchive/src/error.rs +++ b/libraries/libarchive/src/error.rs @@ -42,14 +42,14 @@ impl fmt::Display for ArchiveError { } } -impl<'a> From<&'a archive::Handle> for ArchiveError { - fn from(handle: &'a archive::Handle) -> ArchiveError { +impl<'a> From<&'a dyn archive::Handle> for ArchiveError { + fn from(handle: &'a dyn archive::Handle) -> ArchiveError { ArchiveError::Sys(handle.err_code(), handle.err_msg()) } } -impl<'a> From<&'a archive::Handle> for ArchiveResult<()> { - fn from(handle: &'a archive::Handle) -> ArchiveResult<()> { +impl<'a> From<&'a dyn archive::Handle> for ArchiveResult<()> { + fn from(handle: &'a dyn archive::Handle) -> ArchiveResult<()> { match handle.err_code() { ErrCode(0) => Ok(()), _ => Err(ArchiveError::from(handle)), diff --git a/libraries/libarchive/src/reader.rs b/libraries/libarchive/src/reader.rs index da6ad924..2d56ca13 100644 --- a/libraries/libarchive/src/reader.rs +++ b/libraries/libarchive/src/reader.rs @@ -57,7 +57,13 @@ pub trait Reader: Handle { unsafe { match ffi::archive_read_data_block(self.handle(), &mut buff, &mut size, &mut offset) { ffi::ARCHIVE_EOF => Ok(None), - ffi::ARCHIVE_OK => Ok(Some(slice::from_raw_parts(buff as *const u8, size))), + ffi::ARCHIVE_OK => { + if buff != ptr::null() { + Ok(Some(slice::from_raw_parts(buff as *const u8, size))) + } else { + return self.read_block(); + } + } _ => Err(ArchiveError::Sys(self.err_code(), self.err_msg())), } }