Skip to content

Commit 297208f

Browse files
Johan-Liebert1allisonkarlitskaya
authored andcommitted
skopeo: Use podman unshare for containers-storage when not root
Calling `podman unshare` from inside a rootful container fails, which breaks image pulls in said case. We have sufficient privileges to pull from containers storage if we are in a rootful container thus don't need unshare Signed-off-by: Pragyan Poudyal <[email protected]>
1 parent 9b6b2a0 commit 297208f

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

crates/composefs/src/repository.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::{
2525
},
2626
mount::mount_composefs_at,
2727
splitstream::{DigestMap, SplitStreamReader, SplitStreamWriter},
28-
util::{proc_self_fd, Sha256Digest},
28+
util::{filter_errno, proc_self_fd, Sha256Digest},
2929
};
3030

3131
/// Call openat() on the named subdirectory of "dirfd", possibly creating it first.
@@ -485,15 +485,28 @@ impl<ObjectID: FsVerityHashValue> Repository<ObjectID> {
485485
fn gc_category(&self, category: &str) -> Result<HashSet<ObjectID>> {
486486
let mut objects = HashSet::new();
487487

488-
let category_fd = self.openat(category, OFlags::RDONLY | OFlags::DIRECTORY)?;
488+
let Some(category_fd) = filter_errno(
489+
self.openat(category, OFlags::RDONLY | OFlags::DIRECTORY),
490+
Errno::NOENT,
491+
)
492+
.context("Opening {category} dir in repository")?
493+
else {
494+
return Ok(objects);
495+
};
489496

490-
let refs = openat(
491-
&category_fd,
492-
"refs",
493-
OFlags::RDONLY | OFlags::DIRECTORY,
494-
Mode::empty(),
495-
)?;
496-
Self::walk_symlinkdir(refs, &mut objects)?;
497+
if let Some(refs) = filter_errno(
498+
openat(
499+
&category_fd,
500+
"refs",
501+
OFlags::RDONLY | OFlags::DIRECTORY,
502+
Mode::empty(),
503+
),
504+
Errno::NOENT,
505+
)
506+
.context("Opening {category}/refs dir in repository")?
507+
{
508+
Self::walk_symlinkdir(refs, &mut objects)?;
509+
}
497510

498511
for item in Dir::read_from(&category_fd)? {
499512
let entry = item?;

crates/composefs/src/util.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::{
33
os::fd::{AsFd, AsRawFd},
44
};
55

6+
use rustix::io::{Errno, Result as ErrnoResult};
67
use tokio::io::{AsyncRead, AsyncReadExt};
78

89
/// Formats a string like "/proc/self/fd/3" for the given fd. This can be used to work with kernel
@@ -97,6 +98,17 @@ pub fn parse_sha256(string: impl AsRef<str>) -> Result<Sha256Digest> {
9798
Ok(value)
9899
}
99100

101+
pub(crate) fn filter_errno<T>(
102+
result: rustix::io::Result<T>,
103+
ignored: Errno,
104+
) -> ErrnoResult<Option<T>> {
105+
match result {
106+
Ok(result) => Ok(Some(result)),
107+
Err(err) if err == ignored => Ok(None),
108+
Err(err) => Err(err),
109+
}
110+
}
111+
100112
#[cfg(test)]
101113
mod test {
102114
use similar_asserts::assert_eq;

0 commit comments

Comments
 (0)