From c23a457e72abe608715ac76f076f47dc42af07a5 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 30 May 2024 20:31:44 +0200 Subject: Merging upstream version 1.74.1+dfsg1. Signed-off-by: Daniel Baumann --- vendor/tar/.cargo-checksum.json | 2 +- vendor/tar/Cargo.lock | 95 +++++++++++++---------------------------- vendor/tar/Cargo.toml | 4 +- vendor/tar/src/archive.rs | 23 +++++++--- vendor/tar/src/pax.rs | 40 ++++++++++++++--- vendor/tar/tests/all.rs | 27 ++++++++++++ 6 files changed, 110 insertions(+), 81 deletions(-) (limited to 'vendor/tar') diff --git a/vendor/tar/.cargo-checksum.json b/vendor/tar/.cargo-checksum.json index 792994f55..77504e32a 100644 --- a/vendor/tar/.cargo-checksum.json +++ b/vendor/tar/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"a074bb3491e0d988605218e794859ddb067bb624e793a053645fbbabadde83f6","Cargo.toml":"638559bf51f1b89359ece700138f774bc0a5c1513046e306d6109dc045799b84","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"71079f1a0962c2cf288058f38d24735bddabd1427ac2dee72ec18cc5ae4bceed","examples/extract_file.rs":"dc487f6631d824175afc3ee33de99e80718a8ca3f9e57fddd7cac0a46c07d3ae","examples/list.rs":"36e412205eaffea8ab7f39be4173594b74e36acb369e091362b1975ee4a7a14b","examples/raw_list.rs":"0a735576ac354457d6d5a4d395d044fae99bf67a7c69960ca784a6f6a1743651","examples/write.rs":"419ac3e4155035e32b52cd8e6ae987a2d99cf82f60abbfb315c2a2c4f8e8fd19","src/archive.rs":"9238c58f5a253034f490ede4c42de6e1b89986ee6db343920ee34b3dcfa5b238","src/builder.rs":"2914f394d44c133557532bf5765fe63e0def30ec0b447f8f2bc620e932a2036a","src/entry.rs":"0e4b0438cbc4cbec30a821ce8f23619fe9e53c17022a022de609d642e220193c","src/entry_type.rs":"0786688729a96b4a3135b28d40b95c3d4feaad66b9574c490cbea14814ab975f","src/error.rs":"a20813fbc52f1f2e3a79654f62de6001759f6504a06acee5b0819d4865398587","src/header.rs":"fb2b1fa943c19635826b3f2becfb82527be7d08fdac115af840da3ff06152908","src/lib.rs":"5468e413205c907c367c35d28a528389103d68fd6a5b5979bbedba7c9e6b6c99","src/pax.rs":"54002e31151f9c50e02a3da26b3cacd1d3c9a3902daee008ab76d112cf5a2430","tests/all.rs":"7a64869cd99a4642f2db71aa7d283633199e59b88ccca112cb467b0739e64e83","tests/entry.rs":"af12d84160e5459ebaee6ecdd68e0c811438c37c0cb881ad210e7f94132b9739","tests/header/mod.rs":"02b05639f63c39a47559650c7209817bb60282deb4f679d5b001ed936343d9de"},"package":"ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96"} \ No newline at end of file +{"files":{"Cargo.lock":"734d770757fa895a8c4e215b8063840d33083d007e02d70dfb47a07cd348b933","Cargo.toml":"1e1da319c4d28693a3e42e014ed00828480994b55b15003052f21f2342a346bb","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"71079f1a0962c2cf288058f38d24735bddabd1427ac2dee72ec18cc5ae4bceed","examples/extract_file.rs":"dc487f6631d824175afc3ee33de99e80718a8ca3f9e57fddd7cac0a46c07d3ae","examples/list.rs":"36e412205eaffea8ab7f39be4173594b74e36acb369e091362b1975ee4a7a14b","examples/raw_list.rs":"0a735576ac354457d6d5a4d395d044fae99bf67a7c69960ca784a6f6a1743651","examples/write.rs":"419ac3e4155035e32b52cd8e6ae987a2d99cf82f60abbfb315c2a2c4f8e8fd19","src/archive.rs":"e38b876270e3e4e7bac24fc4bf74e05df362102113cf0e024334a853a824f61e","src/builder.rs":"2914f394d44c133557532bf5765fe63e0def30ec0b447f8f2bc620e932a2036a","src/entry.rs":"0e4b0438cbc4cbec30a821ce8f23619fe9e53c17022a022de609d642e220193c","src/entry_type.rs":"0786688729a96b4a3135b28d40b95c3d4feaad66b9574c490cbea14814ab975f","src/error.rs":"a20813fbc52f1f2e3a79654f62de6001759f6504a06acee5b0819d4865398587","src/header.rs":"fb2b1fa943c19635826b3f2becfb82527be7d08fdac115af840da3ff06152908","src/lib.rs":"5468e413205c907c367c35d28a528389103d68fd6a5b5979bbedba7c9e6b6c99","src/pax.rs":"0509d9afa47ae9f1658bf7d02d12a9791f717971736c4e2041c5fb5f7c5354c8","tests/all.rs":"81bfe5fb71e8d2dd7455c126fc77aa40c2011a2cd5871d785e39e6fb053bf352","tests/entry.rs":"af12d84160e5459ebaee6ecdd68e0c811438c37c0cb881ad210e7f94132b9739","tests/header/mod.rs":"02b05639f63c39a47559650c7209817bb60282deb4f679d5b001ed936343d9de"},"package":"b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb"} \ No newline at end of file diff --git a/vendor/tar/Cargo.lock b/vendor/tar/Cargo.lock index f63a631ad..3c197016f 100644 --- a/vendor/tar/Cargo.lock +++ b/vendor/tar/Cargo.lock @@ -3,22 +3,25 @@ version = 3 [[package]] -name = "autocfg" -version = "1.1.0" +name = "bitflags" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" [[package]] name = "cc" -version = "1.0.79" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -28,9 +31,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "errno" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -49,48 +52,19 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "filetime" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.2.16", - "windows-sys", -] - -[[package]] -name = "hermit-abi" -version = "0.3.2" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", "libc", + "redox_syscall", "windows-sys", ] @@ -102,18 +76,9 @@ checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "redox_syscall" -version = "0.2.16" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[package]] name = "redox_syscall" @@ -121,18 +86,17 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "rustix" -version = "0.37.23" +version = "0.38.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "172891ebdceb05aa0005f533a6cbfca599ddd7d966f6f5d4d9b2e70478e70399" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", "windows-sys", @@ -140,7 +104,7 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.39" +version = "0.4.40" dependencies = [ "filetime", "libc", @@ -150,14 +114,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" dependencies = [ - "autocfg", "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", "windows-sys", ] @@ -230,9 +193,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "xattr" -version = "0.2.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" dependencies = [ "libc", ] diff --git a/vendor/tar/Cargo.toml b/vendor/tar/Cargo.toml index 6225b778f..3fe607f97 100644 --- a/vendor/tar/Cargo.toml +++ b/vendor/tar/Cargo.toml @@ -12,7 +12,7 @@ [package] edition = "2018" name = "tar" -version = "0.4.39" +version = "0.4.40" authors = ["Alex Crichton "] exclude = ["tests/archives/*"] description = """ @@ -45,5 +45,5 @@ default = ["xattr"] version = "0.2" [target."cfg(unix)".dependencies.xattr] -version = "0.2" +version = "1.0" optional = true diff --git a/vendor/tar/src/archive.rs b/vendor/tar/src/archive.rs index c7a9d9803..760b2cb82 100644 --- a/vendor/tar/src/archive.rs +++ b/vendor/tar/src/archive.rs @@ -10,7 +10,7 @@ use std::path::Path; use crate::entry::{EntryFields, EntryIo}; use crate::error::TarError; use crate::other; -use crate::pax::pax_extensions_size; +use crate::pax::*; use crate::{Entry, GnuExtSparseHeader, GnuSparseHeader, Header}; /// A top-level representation of an archive file. @@ -275,7 +275,7 @@ impl<'a, R: Read> Iterator for Entries<'a, R> { impl<'a> EntriesFields<'a> { fn next_entry_raw( &mut self, - pax_size: Option, + pax_extensions: Option<&[u8]>, ) -> io::Result>> { let mut header = Header::new_old(); let mut header_pos = self.next; @@ -315,6 +315,19 @@ impl<'a> EntriesFields<'a> { return Err(other("archive header checksum mismatch")); } + let mut pax_size: Option = None; + if let Some(pax_extensions_ref) = &pax_extensions { + pax_size = pax_extensions_value(pax_extensions_ref, PAX_SIZE); + + if let Some(pax_uid) = pax_extensions_value(pax_extensions_ref, PAX_UID) { + header.set_uid(pax_uid); + } + + if let Some(pax_gid) = pax_extensions_value(pax_extensions_ref, PAX_GID) { + header.set_gid(pax_gid); + } + } + let file_pos = self.next; let mut size = header.entry_size()?; if size == 0 { @@ -360,11 +373,10 @@ impl<'a> EntriesFields<'a> { let mut gnu_longname = None; let mut gnu_longlink = None; let mut pax_extensions = None; - let mut pax_size = None; let mut processed = 0; loop { processed += 1; - let entry = match self.next_entry_raw(pax_size)? { + let entry = match self.next_entry_raw(pax_extensions.as_deref())? { Some(entry) => entry, None if processed > 1 => { return Err(other( @@ -408,9 +420,6 @@ impl<'a> EntriesFields<'a> { )); } pax_extensions = Some(EntryFields::from(entry).read_all()?); - if let Some(pax_extensions_ref) = &pax_extensions { - pax_size = pax_extensions_size(pax_extensions_ref); - } continue; } diff --git a/vendor/tar/src/pax.rs b/vendor/tar/src/pax.rs index 80ca3e9b4..6e83edce8 100644 --- a/vendor/tar/src/pax.rs +++ b/vendor/tar/src/pax.rs @@ -1,9 +1,39 @@ +#![allow(dead_code)] use std::io; use std::slice; use std::str; use crate::other; +// Keywords for PAX extended header records. +pub const PAX_NONE: &str = ""; // Indicates that no PAX key is suitable +pub const PAX_PATH: &str = "path"; +pub const PAX_LINKPATH: &str = "linkpath"; +pub const PAX_SIZE: &str = "size"; +pub const PAX_UID: &str = "uid"; +pub const PAX_GID: &str = "gid"; +pub const PAX_UNAME: &str = "uname"; +pub const PAX_GNAME: &str = "gname"; +pub const PAX_MTIME: &str = "mtime"; +pub const PAX_ATIME: &str = "atime"; +pub const PAX_CTIME: &str = "ctime"; // Removed from later revision of PAX spec, but was valid +pub const PAX_CHARSET: &str = "charset"; // Currently unused +pub const PAX_COMMENT: &str = "comment"; // Currently unused + +pub const PAX_SCHILYXATTR: &str = "SCHILY.xattr."; + +// Keywords for GNU sparse files in a PAX extended header. +pub const PAX_GNUSPARSE: &str = "GNU.sparse."; +pub const PAX_GNUSPARSENUMBLOCKS: &str = "GNU.sparse.numblocks"; +pub const PAX_GNUSPARSEOFFSET: &str = "GNU.sparse.offset"; +pub const PAX_GNUSPARSENUMBYTES: &str = "GNU.sparse.numbytes"; +pub const PAX_GNUSPARSEMAP: &str = "GNU.sparse.map"; +pub const PAX_GNUSPARSENAME: &str = "GNU.sparse.name"; +pub const PAX_GNUSPARSEMAJOR: &str = "GNU.sparse.major"; +pub const PAX_GNUSPARSEMINOR: &str = "GNU.sparse.minor"; +pub const PAX_GNUSPARSESIZE: &str = "GNU.sparse.size"; +pub const PAX_GNUSPARSEREALSIZE: &str = "GNU.sparse.realsize"; + /// An iterator over the pax extensions in an archive entry. /// /// This iterator yields structures which can themselves be parsed into @@ -30,13 +60,13 @@ pub struct PaxExtension<'entry> { value: &'entry [u8], } -pub fn pax_extensions_size(a: &[u8]) -> Option { +pub fn pax_extensions_value(a: &[u8], key: &str) -> Option { for extension in PaxExtensions::new(a) { let current_extension = match extension { Ok(ext) => ext, Err(_) => return None, }; - if current_extension.key() != Ok("size") { + if current_extension.key() != Ok(key) { continue; } @@ -44,11 +74,11 @@ pub fn pax_extensions_size(a: &[u8]) -> Option { Ok(value) => value, Err(_) => return None, }; - let size = match value.parse::() { - Ok(size) => size, + let result = match value.parse::() { + Ok(result) => result, Err(_) => return None, }; - return Some(size); + return Some(result); } None } diff --git a/vendor/tar/tests/all.rs b/vendor/tar/tests/all.rs index 8c5359c56..a7954e1fb 100644 --- a/vendor/tar/tests/all.rs +++ b/vendor/tar/tests/all.rs @@ -1488,3 +1488,30 @@ fn ownership_preserving() { assert!(ar.unpack(td.path()).is_err()); } } + +#[test] +#[cfg(unix)] +fn pax_and_gnu_uid_gid() { + let tarlist = [tar!("biguid_gnu.tar"), tar!("biguid_pax.tar")]; + + for file in &tarlist { + let td = t!(TempBuilder::new().prefix("tar-rs").tempdir()); + let rdr = Cursor::new(file); + let mut ar = Archive::new(rdr); + ar.set_preserve_ownerships(true); + + if unsafe { libc::getuid() } == 0 { + t!(ar.unpack(td.path())); + let meta = fs::metadata(td.path().join("test.txt")).unwrap(); + let uid = std::os::unix::prelude::MetadataExt::uid(&meta); + let gid = std::os::unix::prelude::MetadataExt::gid(&meta); + // 4294967294 = u32::MAX - 1 + assert_eq!(uid, 4294967294); + assert_eq!(gid, 4294967294); + } else { + // it's not possible to unpack tar while preserving ownership + // without root permissions + assert!(ar.unpack(td.path()).is_err()); + } + } +} -- cgit v1.2.3