Skip to content

Commit 375b686

Browse files
authored
Merge pull request ostreedev#669 from cgwalters/fix-selinux
store: Use policy from merged tree with derived layers
2 parents d786229 + 776213c commit 375b686

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

.github/workflows/rust.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,24 @@ jobs:
146146
run: install ostree-ext-cli /usr/bin && rm -v ostree-ext-cli
147147
- name: Integration tests
148148
run: ./ci/priv-integration.sh
149+
privtest-cockpit:
150+
name: "Privileged testing (cockpit)"
151+
needs: build
152+
runs-on: ubuntu-latest
153+
container:
154+
image: quay.io/fedora/fedora-bootc:41
155+
options: "--privileged --pid=host -v /var/tmp:/var/tmp -v /run/dbus:/run/dbus -v /run/systemd:/run/systemd -v /:/run/host"
156+
steps:
157+
- name: Checkout repository
158+
uses: actions/checkout@v4
159+
- name: Download
160+
uses: actions/[email protected]
161+
with:
162+
name: ostree-ext-cli
163+
- name: Install
164+
run: install ostree-ext-cli /usr/bin && rm -v ostree-ext-cli
165+
- name: Integration tests
166+
run: ./ci/priv-test-cockpit-selinux.sh
149167
container-build:
150168
name: "Container build"
151169
needs: build

ci/priv-test-cockpit-selinux.sh

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/bin/bash
2+
# Assumes that the current environment is a privileged container
3+
# with the host mounted at /run/host. We can basically write
4+
# whatever we want, however we can't actually *reboot* the host.
5+
set -euo pipefail
6+
7+
sysroot=/run/host
8+
stateroot=test-cockpit
9+
repo=$sysroot/ostree/repo
10+
image=registry.gitlab.com/fedora/bootc/tests/container-fixtures/cockpit
11+
imgref=ostree-unverified-registry:${image}
12+
13+
cd $(mktemp -d -p /var/tmp)
14+
15+
set -x
16+
17+
if test '!' -e "${sysroot}/ostree"; then
18+
ostree admin init-fs --epoch=1 "${sysroot}"
19+
ostree config --repo $repo set sysroot.bootloader none
20+
fi
21+
ostree admin stateroot-init "${stateroot}" --sysroot "${sysroot}"
22+
ostree-ext-cli container image deploy --sysroot "${sysroot}" \
23+
--stateroot "${stateroot}" --imgref "${imgref}"
24+
ref=$(ostree refs --repo $repo ostree/container/image | head -1)
25+
commit=$(ostree rev-parse --repo $repo ostree/container/image/$ref)
26+
ostree ls --repo $repo -X ${commit} /usr/lib/systemd/system|grep -i cockpit >out.txt
27+
if ! grep -q :cockpit_unit_file_t:s0 out.txt; then
28+
echo "failed to find cockpit_unit_file_t" 1>&2
29+
exit 1
30+
fi
31+
32+
echo ok "derived selinux"

lib/src/container/store.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,7 @@ impl ImageImporter {
861861

862862
let mut layer_commits = Vec::new();
863863
let mut layer_filtered_content: MetaFilteredData = HashMap::new();
864+
let have_derived_layers = !import.layers.is_empty();
864865
for layer in import.layers {
865866
if let Some(c) = layer.commit {
866867
tracing::debug!("Reusing fetched commit {}", c);
@@ -990,7 +991,19 @@ impl ImageImporter {
990991
let modifier =
991992
ostree::RepoCommitModifier::new(ostree::RepoCommitModifierFlags::CONSUME, None);
992993
modifier.set_devino_cache(&devino);
993-
modifier.set_sepolicy_from_commit(repo, &base_commit, cancellable)?;
994+
// If we have derived layers, then we need to handle the case where
995+
// the derived layers include custom policy. Just relabel everything
996+
// in this case.
997+
if have_derived_layers {
998+
let rootpath = td.open_dir(rootpath)?;
999+
let sepolicy = ostree::SePolicy::new_at(rootpath.as_raw_fd(), cancellable)?;
1000+
tracing::debug!("labeling from merged tree");
1001+
modifier.set_sepolicy(Some(&sepolicy));
1002+
} else {
1003+
tracing::debug!("labeling from base tree");
1004+
// TODO: We can likely drop this; we know all labels should be pre-computed.
1005+
modifier.set_sepolicy_from_commit(repo, &base_commit, cancellable)?;
1006+
}
9941007

9951008
let mt = ostree::MutableTree::new();
9961009
repo.write_dfd_to_mtree(

0 commit comments

Comments
 (0)