mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
5e1dcdf564
The code which determines inner cgroup path from cgroup config is identical in fs and fs2 drivers, and it is using utils.CleanPath. In preparation to move libcontainer/cgroups to a separate repo, we have to get rid of libcontainer/utils dependency. So, - copy the utils.CleanPath implementation to internal/path; - consolidate the two innerPath implementations to internal/path. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
105 lines
2.6 KiB
Go
105 lines
2.6 KiB
Go
package fs
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
|
"github.com/opencontainers/runc/libcontainer/cgroups/internal/path"
|
|
)
|
|
|
|
func TestInvalidCgroupPath(t *testing.T) {
|
|
if cgroups.IsCgroup2UnifiedMode() {
|
|
t.Skip("cgroup v2 is not supported")
|
|
}
|
|
|
|
root, err := rootPath()
|
|
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 := &cgroups.Cgroup{Path: tc.path, Name: tc.name, Parent: tc.parent}
|
|
|
|
inner, err := path.Inner(config)
|
|
if err != nil {
|
|
t.Fatalf("couldn't get cgroup data: %v", err)
|
|
}
|
|
|
|
// Make sure the final inner path doesn't go outside the cgroup mountpoint.
|
|
if strings.HasPrefix(inner, "..") {
|
|
t.Errorf("SECURITY: cgroup innerPath is outside cgroup mountpoint!")
|
|
}
|
|
|
|
// Double-check, using an actual cgroup.
|
|
deviceRoot := filepath.Join(root, "devices")
|
|
devicePath, err := subsysPath(root, inner, "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)
|
|
}
|
|
}
|