From e5471b483620f5ad524be31f40276ed6697f1725 Mon Sep 17 00:00:00 2001 From: Christian Ebner Date: Tue, 20 Aug 2019 13:40:19 +0200 Subject: [PATCH] pxar/decoder: avoid failing on hardlinks and return corresponding target file entry Signed-off-by: Christian Ebner [Fixup: remove unnecessary 'mut'] Signed-off-by: Wolfgang Bumiller --- src/pxar/decoder.rs | 4 ++++ src/pxar/sequential_decoder.rs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pxar/decoder.rs b/src/pxar/decoder.rs index 8ebf530b..9e182455 100644 --- a/src/pxar/decoder.rs +++ b/src/pxar/decoder.rs @@ -90,6 +90,10 @@ impl Result<(), Error>> Decoder { let filename = self.inner.read_filename(head.size)?; let head: PxarHeader = self.inner.read_item()?; + if head.htype == PXAR_FORMAT_HARDLINK { + let (_, offset) = self.inner.read_hardlink(head.size)?; + return self.read_directory_entry(start - offset, end); + } check_ca_header::(&head, PXAR_ENTRY)?; let entry: PxarEntry = self.inner.read_item()?; diff --git a/src/pxar/sequential_decoder.rs b/src/pxar/sequential_decoder.rs index f3a0643b..507c600d 100644 --- a/src/pxar/sequential_decoder.rs +++ b/src/pxar/sequential_decoder.rs @@ -99,7 +99,7 @@ impl Result<(), Error>> SequentialDecoder { Ok(PathBuf::from(std::ffi::OsString::from_vec(buffer))) } - fn read_hardlink(&mut self, size: u64) -> Result<(PathBuf, u64), Error> { + pub (crate) fn read_hardlink(&mut self, size: u64) -> Result<(PathBuf, u64), Error> { if size < (HEADER_SIZE + 8 + 2) { bail!("dectected short hardlink header."); }