mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 22:37:14 +08:00
637d54b7ce
All the test cases are doing the same checks, only input differs, so we can unify those using a test data table. While at it: - use t.Fatalf where it makes sense (no further checks are possible); - remove the "XXX" comments as we won't get rid of cgroup Name/Parent. PS I tried using t.Parallel() as well but it did not result in any noticeable speedup, so I dropped it for simplicity. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
107 lines
2.6 KiB
Go
107 lines
2.6 KiB
Go
// +build linux
|
|
|
|
package fs
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
|
"github.com/opencontainers/runc/libcontainer/configs"
|
|
)
|
|
|
|
func TestInvalidCgroupPath(t *testing.T) {
|
|
if cgroups.IsCgroup2UnifiedMode() {
|
|
t.Skip("cgroup v2 is not supported")
|
|
}
|
|
|
|
root, err := getCgroupRoot()
|
|
if err != nil {
|
|
t.Fatalf("couldn't get cgroup root: %v", err)
|
|
}
|
|
|
|
testCases := []struct {
|
|
test string
|
|
path, name, parent string
|
|
}{
|
|
{
|
|
test: "invalid cgroup path",
|
|
path: "../../../../../../../../../../some/path",
|
|
},
|
|
{
|
|
test: "invalid absolute cgroup path",
|
|
path: "/../../../../../../../../../../some/path",
|
|
},
|
|
{
|
|
test: "invalid cgroup parent",
|
|
parent: "../../../../../../../../../../some/path",
|
|
name: "name",
|
|
},
|
|
{
|
|
test: "invalid absolute cgroup parent",
|
|
parent: "/../../../../../../../../../../some/path",
|
|
name: "name",
|
|
},
|
|
{
|
|
test: "invalid cgroup name",
|
|
parent: "parent",
|
|
name: "../../../../../../../../../../some/path",
|
|
},
|
|
{
|
|
test: "invalid absolute cgroup name",
|
|
parent: "parent",
|
|
name: "/../../../../../../../../../../some/path",
|
|
},
|
|
{
|
|
test: "invalid cgroup name and parent",
|
|
parent: "../../../../../../../../../../some/path",
|
|
name: "../../../../../../../../../../some/path",
|
|
},
|
|
{
|
|
test: "invalid absolute cgroup name and parent",
|
|
parent: "/../../../../../../../../../../some/path",
|
|
name: "/../../../../../../../../../../some/path",
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.test, func(t *testing.T) {
|
|
config := &configs.Cgroup{Path: tc.path, Name: tc.name, Parent: tc.parent}
|
|
|
|
data, err := getCgroupData(config, 0)
|
|
if err != nil {
|
|
t.Fatalf("couldn't get cgroup data: %v", err)
|
|
}
|
|
|
|
// Make sure the final innerPath doesn't go outside the cgroup mountpoint.
|
|
if strings.HasPrefix(data.innerPath, "..") {
|
|
t.Errorf("SECURITY: cgroup innerPath is outside cgroup mountpoint!")
|
|
}
|
|
|
|
// Double-check, using an actual cgroup.
|
|
deviceRoot := filepath.Join(root, "devices")
|
|
devicePath, err := data.path("devices")
|
|
if err != nil {
|
|
t.Fatalf("couldn't get cgroup path: %v", err)
|
|
}
|
|
if !strings.HasPrefix(devicePath, deviceRoot) {
|
|
t.Errorf("SECURITY: cgroup path() is outside cgroup mountpoint!")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTryDefaultCgroupRoot(t *testing.T) {
|
|
res := tryDefaultCgroupRoot()
|
|
exp := defaultCgroupRoot
|
|
if cgroups.IsCgroup2UnifiedMode() {
|
|
// checking that tryDefaultCgroupRoot does return ""
|
|
// in case /sys/fs/cgroup is not cgroup v1 root dir.
|
|
exp = ""
|
|
}
|
|
if res != exp {
|
|
t.Errorf("tryDefaultCgroupRoot: want %q, got %q", exp, res)
|
|
}
|
|
}
|