mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
Merge pull request #3961 from lifubang/backport-ModeStricky
[1.1] Fix some file mode bits missing when doing mount syscall
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package libcontainer
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"strconv"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
@@ -81,3 +82,20 @@ func unmount(target string, flags int) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// syscallMode returns the syscall-specific mode bits from Go's portable mode bits.
|
||||
// Copy from https://cs.opensource.google/go/go/+/refs/tags/go1.20.7:src/os/file_posix.go;l=61-75
|
||||
func syscallMode(i fs.FileMode) (o uint32) {
|
||||
o |= uint32(i.Perm())
|
||||
if i&fs.ModeSetuid != 0 {
|
||||
o |= unix.S_ISUID
|
||||
}
|
||||
if i&fs.ModeSetgid != 0 {
|
||||
o |= unix.S_ISGID
|
||||
}
|
||||
if i&fs.ModeSticky != 0 {
|
||||
o |= unix.S_ISVTX
|
||||
}
|
||||
// No mapping for Go's ModeTemporary (plan9 only).
|
||||
return
|
||||
}
|
||||
|
||||
@@ -464,7 +464,7 @@ func mountToRootfs(m *configs.Mount, c *mountConfig) error {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
dt := fmt.Sprintf("mode=%04o", stat.Mode())
|
||||
dt := fmt.Sprintf("mode=%04o", syscallMode(stat.Mode()))
|
||||
if m.Data != "" {
|
||||
dt = dt + "," + m.Data
|
||||
}
|
||||
|
||||
@@ -59,6 +59,22 @@ function teardown() {
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
|
||||
# https://github.com/opencontainers/runc/issues/3952
|
||||
@test "runc run with tmpfs" {
|
||||
requires root
|
||||
|
||||
chmod 'a=rwx,ug+s,+t' rootfs/tmp # set all bits
|
||||
mode=$(stat -c %A rootfs/tmp)
|
||||
|
||||
# shellcheck disable=SC2016
|
||||
update_config '.process.args = ["sh", "-c", "stat -c %A /tmp"]'
|
||||
update_config '.mounts += [{"destination": "/tmp", "type": "tmpfs", "source": "tmpfs", "options":["noexec","nosuid","nodev","rprivate"]}]'
|
||||
|
||||
runc run test_tmpfs
|
||||
[ "$status" -eq 0 ]
|
||||
[ "$output" = "$mode" ]
|
||||
}
|
||||
|
||||
@test "runc run with tmpfs perms" {
|
||||
# shellcheck disable=SC2016
|
||||
update_config '.process.args = ["sh", "-c", "stat -c %a /tmp/test"]'
|
||||
|
||||
Reference in New Issue
Block a user