Skip to content

core/mount: fix getUnprivilegedMountFlags iterating over indices instead of values#12941

Merged
AkihiroSuda merged 2 commits intocontainerd:mainfrom
lukefr09:fix-unprivileged-mount-flags
Feb 26, 2026
Merged

core/mount: fix getUnprivilegedMountFlags iterating over indices instead of values#12941
AkihiroSuda merged 2 commits intocontainerd:mainfrom
lukefr09:fix-unprivileged-mount-flags

Conversation

@lukefr09
Copy link
Copy Markdown
Contributor

Resubmission of #12939 — accidentally closed when cleaning up unrelated branches. Same fix, already reviewed by @dcantah.

Original description:

  • getUnprivilegedMountFlags uses for flag := range unprivilegedFlags which iterates over slice indices (0–6) instead of the actual flag values (MS_RDONLY, MS_NODEV, etc.)
  • This was a porting error from moby/moby where the data structure was a map[uint64]string. When converted to []int, the loop was not updated to for _, flag := range.
  • As a result, MS_NOEXEC, MS_NOATIME, MS_RELATIME, and MS_NODIRATIME are never detected or preserved during bind-mount remounts in user namespaces
  • Fix: change for flag := range to for _, flag := range to iterate over values
  • Includes test for getUnprivilegedMountFlags

…ead of values

The loop `for flag := range unprivilegedFlags` iterates over slice
indices (0,1,2,3,4,5,6) rather than the actual flag values (MS_RDONLY,
MS_NODEV, etc). This was a porting error from moby/moby where the data
structure was a map (where `for k := range m` yields keys/values).

As a result, MS_NOEXEC, MS_NOATIME, MS_RELATIME, and MS_NODIRATIME are
never detected or preserved. In user namespaces, this causes bind-mount
remounts to fail with EPERM when any of these flags are locked on the
parent mount, because the kernel requires all CL_UNPRIVILEGED locked
flags to be preserved during remount.

MS_RDONLY (0x1), MS_NOSUID (0x2), and MS_NODEV (0x4) happened to work
by coincidence because their values equal low index numbers.

Fix by using `for _, flag := range` to iterate over values.

Signed-off-by: Luke Hinds <[email protected]>
Mounts a tmpfs with MS_NOEXEC, MS_NOATIME, and MS_NODIRATIME and
verifies that getUnprivilegedMountFlags detects all of them. These
three flags were the ones missed by the range-over-indices bug.

Also verifies that flags not present on the mount (MS_NOSUID,
MS_NODEV, MS_RDONLY) are not falsely reported.

Signed-off-by: Luke Hinds <[email protected]>
@dcantah
Copy link
Copy Markdown
Member

dcantah commented Feb 26, 2026

@lukefr09 I'm pretty sure you could've reopened the other PR

@lukefr09
Copy link
Copy Markdown
Contributor Author

@lukefr09 I'm pretty sure you could've reopened the other PR

I deleted the fork repo by accident which killed the source branch so GitHub wouldn't let me reopen without it. Sorry for the duplicate! Luke

@AkihiroSuda AkihiroSuda added cherry-pick/2.1.x Change to be cherry picked to release/2.1 branch cherry-pick/2.2.x Change to be cherry picked to release/2.2 branch labels Feb 26, 2026
@AkihiroSuda
Copy link
Copy Markdown
Member

/cherry-pick release/2.1
/cherry-pick release/2.2

@k8s-infra-cherrypick-robot
Copy link
Copy Markdown

@AkihiroSuda: once the present PR merges, I will cherry-pick it on top of release/2.1, release/2.2 in new PRs and assign them to you.

Details

In response to this:

/cherry-pick release/2.1
/cherry-pick release/2.2

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@github-project-automation github-project-automation Bot moved this from Needs Triage to Review In Progress in Pull Request Review Feb 26, 2026
@AkihiroSuda AkihiroSuda added this pull request to the merge queue Feb 26, 2026
Merged via the queue into containerd:main with commit 7e6fd22 Feb 26, 2026
93 of 94 checks passed
@github-project-automation github-project-automation Bot moved this from Review In Progress to Done in Pull Request Review Feb 26, 2026
@k8s-infra-cherrypick-robot
Copy link
Copy Markdown

@AkihiroSuda: new pull request created: #12943

Details

In response to this:

/cherry-pick release/2.1
/cherry-pick release/2.2

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@k8s-infra-cherrypick-robot
Copy link
Copy Markdown

@AkihiroSuda: new pull request created: #12944

Details

In response to this:

/cherry-pick release/2.1
/cherry-pick release/2.2

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@austinvazquez austinvazquez added cherry-picked/2.1.x PR commits are cherry picked into the release/2.1 branch cherry-picked/2.2.x PR commits are cherry-picked into release/2.2 branch and removed cherry-pick/2.1.x Change to be cherry picked to release/2.1 branch cherry-pick/2.2.x Change to be cherry picked to release/2.2 branch labels Mar 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/runtime Runtime cherry-picked/2.1.x PR commits are cherry picked into the release/2.1 branch cherry-picked/2.2.x PR commits are cherry-picked into release/2.2 branch kind/bug size/M

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

6 participants