From 6fa206d6c9972a027e12b5588f193d06b375329f Mon Sep 17 00:00:00 2001 From: Takaya Saeki Date: Mon, 12 Jul 2021 23:18:20 +0900 Subject: [PATCH] Read the `linkpath` PAX extension (#252) --- src/entry.rs | 13 ++++++++++++- tests/all.rs | 16 ++++++++++++++++ tests/archives/pax2.tar | Bin 10240 -> 10240 bytes 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/entry.rs b/src/entry.rs index f99c897b..b5e35123 100644 --- a/src/entry.rs +++ b/src/entry.rs @@ -334,7 +334,18 @@ impl<'a> EntryFields<'a> { Some(Cow::Borrowed(bytes)) } } - None => self.header.link_name_bytes(), + None => { + if let Some(ref pax) = self.pax_extensions { + let pax = pax_extensions(pax) + .filter_map(|f| f.ok()) + .find(|f| f.key_bytes() == b"linkpath") + .map(|f| f.value_bytes()); + if let Some(field) = pax { + return Some(Cow::Borrowed(field)); + } + } + self.header.link_name_bytes() + } } } diff --git a/tests/all.rs b/tests/all.rs index 37816875..1abb9161 100644 --- a/tests/all.rs +++ b/tests/all.rs @@ -791,6 +791,22 @@ fn pax_path() { assert!(first.path().unwrap().ends_with("aaaaaaaaaaaaaaa")); } +#[test] +fn pax_linkpath() { + let mut ar = Archive::new(tar!("pax2.tar")); + let mut links = t!(ar.entries()).skip(3).take(2); + + let long_symlink = t!(links.next().unwrap()); + let link_name = long_symlink.link_name().unwrap().unwrap(); + assert!(link_name.to_str().unwrap().len() > 99); + assert!(link_name.ends_with("bbbbbbbbbbbbbbb")); + + let long_hardlink = t!(links.next().unwrap()); + let link_name = long_hardlink.link_name().unwrap().unwrap(); + assert!(link_name.to_str().unwrap().len() > 99); + assert!(link_name.ends_with("ccccccccccccccc")); +} + #[test] fn long_name_trailing_nul() { let mut b = Builder::new(Vec::::new()); diff --git a/tests/archives/pax2.tar b/tests/archives/pax2.tar index c0c8ed314ce8236a40a841950f0b7fbbfe8d7b44..1131af9d8c2fcaed500c6299b33f939155a8c123 100644 GIT binary patch literal 10240 zcmeHM$&!LF5asMw@C7jmNg5B{=QzI*9jnF~bu5=EKYtRGC4m7I$S|0`1ng||@_JE9 zgQmutl%2d|MS`(FkBaOOvq%JlVIUY-!jCY+Gzc$&13Dj1@}REd;HV)UK`{;Y^7J|H zL-B<@J29lX{U$UHx2N@XH79~{9&;fW;+P9YLGz@^Py9a}HA|D_|BSLI2zj@kTD@E9|GV>Mv;VH1qknDUU%w*3j@ zE-!B@`LQ}25g|m(08cHWXnS4lBHt&3gAWiXO0K zx1}5)W&{ydodXo>eAO;CdjN%X_XzbL&9Ow*%gwd_1HfJV-^BkTAYA4D)J1ag;`M(e z{##9fwnp&?{;RnO{_Fma@Bg-yeDnHI;lE|KCH$}ZOE88Q!L83*!vFF1fGv?V8_W|k q3jUwged(xKnzH;)KVyymBnXMe|0ksFmv{+y33v&333v%KOW+4ka^rFU delta 223 zcmZn&Xb70lDq&*6U}$V?Xlh_!Y-DK2U|?)uY;MY+P%&AMF=aC&<4MLSV*`cUlFZyx zTSHT014CmoBLhP{14~OIV