From b8dc59e8d2c0a007a3ecd3a09706e857331dc0ec Mon Sep 17 00:00:00 2001 From: Joseph Marrero Date: Tue, 15 Feb 2022 10:32:29 -0500 Subject: [PATCH] lib/src/tar/write: make sure we add the links when filtering the tar Co-authored-by: Colin Walters --- lib/src/tar/write.rs | 18 +++++++++++++++++- lib/tests/it/fixtures/hlinks.tar.gz | Bin 0 -> 9981 bytes lib/tests/it/main.rs | 11 +++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 lib/tests/it/fixtures/hlinks.tar.gz diff --git a/lib/src/tar/write.rs b/lib/src/tar/write.rs index 7d251b98..34ab7944 100644 --- a/lib/src/tar/write.rs +++ b/lib/src/tar/write.rs @@ -156,7 +156,23 @@ pub(crate) fn filter_tar( }; let mut header = entry.header().clone(); - dest.append_data(&mut header, normalized, entry)?; + + // Need to use the entry.link_name() not the header.link_name() + // api as the header api does not handle long paths: + // https://github.com/alexcrichton/tar-rs/issues/192 + match entry.header().entry_type() { + tar::EntryType::Link | tar::EntryType::Symlink => { + let target = entry.link_name()?.ok_or_else(|| anyhow!("Invalid link"))?; + let target = target + .as_os_str() + .to_str() + .ok_or_else(|| anyhow!("Non-utf8 link"))?; + dest.append_link(&mut header, &normalized, target)?; + } + _ => { + dest.append_data(&mut header, normalized, entry)?; + } + } } dest.into_inner()?.flush()?; Ok(filtered) diff --git a/lib/tests/it/fixtures/hlinks.tar.gz b/lib/tests/it/fixtures/hlinks.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..0bbc06d4960d198f2639e6bafc815ffc186b115f GIT binary patch literal 9981 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�bG4t2A zx|izHU;JdSTXiWYJj|^<-h3)Q5u&}Tvm>P6lW=Vl$g%!CfJox_M@-|RKzaUkQx??Ab z?Z48F2T8sk^4(t3dr@+(F`M8*O{HS;o!-Z8ob;d;Uuc+pcIJu0)*LTXxNGNjwXWtZ4TR1RKNU%a^YU42K~(UtFU{Q+&z>g&U4M1pFZn}PUgU)-RtX|| z?0JZrKJ|ZhQJW=a3_W%0{3SQpHE-VMY+i`GUbaGLI)DAryj=W4N#8@pI{MUR{^M&p z6%!sL&(l2?czlAChg1sdj(!3tsZ;YQW=)1NsJ4#x&B(KVK2Qu^VOwd#1+Dn+z zzoxVpsy$Q!)qPw7)hsK9>Xm(}i<`{9f6<=xoPObz_Ca!1WbNe0#wM5M%J&lm^X-N^ z+i?WGT3jrb--|!>$R|y2?F~0>y9bwvN9X1TCpAVs57+FbxOq9BL_mjb*d9p5i{-=UdQ=!MHnJkA%N@24|1{WuWL%OTyx-o!E^z zj)jl*wR(3c94*;>Zw~&S*9}DqQG`wFw9uEx~ut9B~se=)}r_* zx;WWLyhV8I@>+{)Xw`Wl=_pDa|7ml^b&k%iM?!7%5~Z3Gvig^Fk_zryErsSFuE9R8 z5BH!1b~$@1)v|6@f+J(y?3TuLi8N={JTwzAr>bek_xsdNYU_E6<6HRbTZ4pqs(sqz za3O!%XDP0p#{|cImxeLdGxnj9yHOM~68jm?{Y7)t+JDY)w&r9p-DWcF^j-fepXMC! z0r9RPVe&OV57)p0BmfoKteOoo=A-r>ZM-ph_dj9o>`&daqw zi!U`xhR^t@%UHXu)@UCXzvWE4I-&VkW-&_jV1GE%c0BFZR;Ky(LcNyn)^%;=dKl~W z@ZGZCmpw;)p1(VL_!N})t$voZHYojCU)2n0N&T|XWT1NSEn$<)@+vOw)s17~A;)g{ zL9wyuqUa{9D{k)PmS90!___kQQR1e?!jpEAA;why$tu9gb>WLu{Lumy^(&LBUi&!EU&sf(+lqEP#-3*P5 ztG|n6YRIaia&F{{391Ae6|;hU?msC!O$o629zXu>>COA)SsXB%BsqQXurqRF13}Xz zzQoe*miC*ZwW{>Cy7&os-)HJfv2Puh4&9+R`9HrG=6K{b-8FozzrA7sBY=h7`5pR) z-gon14FBiOomm2L>hlG>WV3iT7dtx6N0<|qY{1kjhM#b6cqVG~ASOrgp}<;X&qb-{ z>Z&aq&+7PgG10aE!+=3gpEC`Gm({m!9uC1$=tBlRTXuvk*4362A~ZP}ID{3R6-joJ zeDa}gzP3?c?BDDZVk^q#%WiC2R5NFBAhr#v-!n-RP^6?nFzu9nq8hY+U)I4k@~X(t zi_+I=`K>{btUH&CvAWUJn-? zjgN02SJum_&tKp-wfkHU_?jnr-1*pX9_$;&ZYC`@V%355b0|o+j)%k{=XXKWIlSZ? kN)YbSNP7cubwi(?Ly7wM|Njpuv5XzC))|hKfQ|Kk0DDoo<^TWy literal 0 HcmV?d00001 diff --git a/lib/tests/it/main.rs b/lib/tests/it/main.rs index 77200d32..cf0abcfd 100644 --- a/lib/tests/it/main.rs +++ b/lib/tests/it/main.rs @@ -15,6 +15,7 @@ use std::process::Command; use fixture::Fixture; +const EXAMPLE_TAR_LAYER: &[u8] = include_bytes!("fixtures/hlinks.tar.gz"); const EXAMPLEOS_CONTENT_CHECKSUM: &str = "0ef7461f9db15e1d8bd8921abf20694225fbaa4462cadf7deed8ea0e43162120"; const TEST_REGISTRY_DEFAULT: &str = "localhost:5000"; @@ -324,6 +325,16 @@ async fn test_tar_write() -> Result<()> { Ok(()) } +#[tokio::test] +async fn test_tar_write_tar_layer() -> Result<()> { + let fixture = Fixture::new()?; + let uncompressed_tar = tokio::io::BufReader::new( + async_compression::tokio::bufread::GzipDecoder::new(EXAMPLE_TAR_LAYER), + ); + ostree_ext::tar::write_tar(&fixture.destrepo, uncompressed_tar, "test", None).await?; + Ok(()) +} + fn skopeo_inspect(imgref: &str) -> Result { let out = Command::new("skopeo") .args(&["inspect", imgref])