package libcontainer import ( "testing" "github.com/opencontainers/runc/libcontainer/configs" "golang.org/x/sys/unix" ) func TestCheckMountDestInProc(t *testing.T) { m := mountEntry{ Mount: &configs.Mount{ Destination: "/proc/sys", Source: "/proc/sys", Device: "bind", Flags: unix.MS_BIND, }, } dest := "/rootfs/proc/sys" err := checkProcMount("/rootfs", dest, m) if err == nil { t.Fatal("destination inside proc should return an error") } } func TestCheckProcMountOnProc(t *testing.T) { m := mountEntry{ Mount: &configs.Mount{ Destination: "/proc", Source: "foo", Device: "proc", }, } dest := "/rootfs/proc/" err := checkProcMount("/rootfs", dest, m) if err != nil { t.Fatalf("procfs type mount on /proc should not return an error: %v", err) } } func TestCheckBindMountOnProc(t *testing.T) { m := mountEntry{ Mount: &configs.Mount{ Destination: "/proc", Source: "/proc/self", Device: "bind", Flags: unix.MS_BIND, }, } dest := "/rootfs/proc/" err := checkProcMount("/rootfs", dest, m) if err != nil { t.Fatalf("bind-mount of procfs on top of /proc should not return an error (for now): %v", err) } } func TestCheckTrickyMountOnProc(t *testing.T) { // Make a non-bind mount that looks like a bit like a bind-mount. m := mountEntry{ Mount: &configs.Mount{ Destination: "/proc", Source: "/proc", Device: "overlay", Data: "lowerdir=/tmp/fakeproc,upperdir=/tmp/fakeproc2,workdir=/tmp/work", }, } dest := "/rootfs/proc/" err := checkProcMount("/rootfs", dest, m) if err == nil { t.Fatalf("dodgy overlayfs mount on top of /proc should return an error") } } func TestCheckTrickyBindMountOnProc(t *testing.T) { // Make a bind mount that looks like it might be a procfs mount. m := mountEntry{ Mount: &configs.Mount{ Destination: "/proc", Source: "/sys", Device: "proc", Flags: unix.MS_BIND, }, } dest := "/rootfs/proc/" err := checkProcMount("/rootfs", dest, m) if err == nil { t.Fatalf("dodgy bind-mount on top of /proc should return an error") } } func TestCheckMountDestInSys(t *testing.T) { m := mountEntry{ Mount: &configs.Mount{ Destination: "/sys/fs/cgroup", Source: "tmpfs", Device: "tmpfs", }, } dest := "/rootfs//sys/fs/cgroup" err := checkProcMount("/rootfs", dest, m) if err != nil { t.Fatalf("destination inside /sys should not return an error: %v", err) } } func TestCheckMountDestFalsePositive(t *testing.T) { m := mountEntry{ Mount: &configs.Mount{ Destination: "/sysfiles/fs/cgroup", Source: "tmpfs", Device: "tmpfs", }, } dest := "/rootfs/sysfiles/fs/cgroup" err := checkProcMount("/rootfs", dest, m) if err != nil { t.Fatal(err) } } func TestCheckMountDestNsLastPid(t *testing.T) { m := mountEntry{ Mount: &configs.Mount{ Destination: "/proc/sys/kernel/ns_last_pid", Source: "lxcfs", Device: "fuse.lxcfs", }, } dest := "/rootfs/proc/sys/kernel/ns_last_pid" err := checkProcMount("/rootfs", dest, m) if err != nil { t.Fatalf("/proc/sys/kernel/ns_last_pid should not return an error: %v", err) } } func TestCheckCryptoFipsEnabled(t *testing.T) { m := mountEntry{ Mount: &configs.Mount{ Destination: "/proc/sys/crypto/fips_enabled", Source: "tmpfs", Device: "tmpfs", }, } dest := "/rootfs/proc/sys/crypto/fips_enabled" err := checkProcMount("/rootfs", dest, m) if err != nil { t.Fatalf("/proc/sys/crypto/fips_enabled should not return an error: %v", err) } } func TestNeedsSetupDev(t *testing.T) { config := &configs.Config{ Mounts: []*configs.Mount{ { Device: "bind", Source: "/dev", Destination: "/dev", }, }, } if needsSetupDev(config) { t.Fatal("expected needsSetupDev to be false, got true") } } func TestNeedsSetupDevStrangeSource(t *testing.T) { config := &configs.Config{ Mounts: []*configs.Mount{ { Device: "bind", Source: "/devx", Destination: "/dev", }, }, } if needsSetupDev(config) { t.Fatal("expected needsSetupDev to be false, got true") } } func TestNeedsSetupDevStrangeDest(t *testing.T) { config := &configs.Config{ Mounts: []*configs.Mount{ { Device: "bind", Source: "/dev", Destination: "/devx", }, }, } if !needsSetupDev(config) { t.Fatal("expected needsSetupDev to be true, got false") } } func TestNeedsSetupDevStrangeSourceDest(t *testing.T) { config := &configs.Config{ Mounts: []*configs.Mount{ { Device: "bind", Source: "/devx", Destination: "/devx", }, }, } if !needsSetupDev(config) { t.Fatal("expected needsSetupDev to be true, got false") } }