summaryrefslogtreecommitdiffstats
path: root/vendor/tar/src/archive.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/tar/src/archive.rs')
-rw-r--r--vendor/tar/src/archive.rs23
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;
}