From af6e0b38f12f23d71a00f7877945fc30c09e165a Mon Sep 17 00:00:00 2001 From: Philip Johansson Date: Tue, 29 Jul 2025 12:00:43 +0200 Subject: [PATCH] entry: Add set_mode method --- src/archive.rs | 1 + src/entry.rs | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/archive.rs b/src/archive.rs index c1ee8f25..184d3521 100644 --- a/src/archive.rs +++ b/src/archive.rs @@ -352,6 +352,7 @@ impl<'a> EntriesFields<'a> { long_linkname: None, pax_extensions: None, mask: self.archive.inner.mask, + mode: None, unpack_xattrs: self.archive.inner.unpack_xattrs, preserve_permissions: self.archive.inner.preserve_permissions, preserve_mtime: self.archive.inner.preserve_mtime, diff --git a/src/entry.rs b/src/entry.rs index 848c15f5..f136c040 100644 --- a/src/entry.rs +++ b/src/entry.rs @@ -32,6 +32,7 @@ pub struct EntryFields<'a> { pub long_linkname: Option>, pub pax_extensions: Option>, pub mask: u32, + pub mode: Option, pub header: Header, pub size: u64, pub header_pos: u64, @@ -246,6 +247,13 @@ impl<'a, R: Read> Entry<'a, R> { self.fields.mask = mask; } + /// Set the permission bits when unpacking this entry. + /// + /// The mode is unchanged by default. + pub fn set_mode(&mut self, mode: u32) { + self.fields.mode = Some(mode); + } + /// Indicate whether extended file attributes (xattrs on Unix) are preserved /// when unpacking this entry. /// @@ -467,13 +475,16 @@ impl<'a> EntryFields<'a> { mask: u32, perms: bool, ownerships: bool, + mode: Option, ) -> io::Result<()> { // ownerships need to be set first to avoid stripping SUID bits in the permissions ... if ownerships { set_ownerships(dst, &f, header.uid()?, header.gid()?)?; } // ... then set permissions, SUID bits set here is kept - if let Ok(mode) = header.mode() { + if let Some(mode) = mode { + set_perms(dst, f, mode, mask, perms)?; + } else if let Ok(mode) = header.mode() { set_perms(dst, f, mode, mask, perms)?; } @@ -504,6 +515,7 @@ impl<'a> EntryFields<'a> { self.mask, self.preserve_permissions, self.preserve_ownerships, + self.mode, )?; return Ok(Unpacked::__Nonexhaustive); } else if kind.is_hard_link() || kind.is_symlink() { @@ -627,6 +639,7 @@ impl<'a> EntryFields<'a> { self.mask, self.preserve_permissions, self.preserve_ownerships, + self.mode, )?; return Ok(Unpacked::__Nonexhaustive); } @@ -703,6 +716,7 @@ impl<'a> EntryFields<'a> { self.mask, self.preserve_permissions, self.preserve_ownerships, + self.mode, )?; if self.unpack_xattrs { set_xattrs(self, dst)?;