diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 18:31:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 18:31:44 +0000 |
commit | c23a457e72abe608715ac76f076f47dc42af07a5 (patch) | |
tree | 2772049aaf84b5c9d0ed12ec8d86812f7a7904b6 /vendor/tar/src/archive.rs | |
parent | Releasing progress-linux version 1.73.0+dfsg1-1~progress7.99u1. (diff) | |
download | rustc-c23a457e72abe608715ac76f076f47dc42af07a5.tar.xz rustc-c23a457e72abe608715ac76f076f47dc42af07a5.zip |
Merging upstream version 1.74.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/tar/src/archive.rs')
-rw-r--r-- | vendor/tar/src/archive.rs | 23 |
1 files changed, 16 insertions, 7 deletions
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<u64>, + pax_extensions: Option<&[u8]>, ) -> io::Result<Option<Entry<'a, io::Empty>>> { 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<u64> = 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; } |