From a1482ecdd0f98728f4b97137cd7b2fa17f67bb89 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Wed, 20 Aug 2025 20:17:28 +0900 Subject: [PATCH] container/inittmpfs: check path equivalence by value Fixes regression introduced while integrating Absolute. Signed-off-by: Ophestra --- container/inittmpfs.go | 7 +- container/inittmpfs_test.go | 134 ++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 container/inittmpfs_test.go diff --git a/container/inittmpfs.go b/container/inittmpfs.go index d4f0323..332fec8 100644 --- a/container/inittmpfs.go +++ b/container/inittmpfs.go @@ -42,6 +42,11 @@ func (t *MountTmpfsOp) apply(*setupState) error { return mountTmpfs(t.FSName, toSysroot(t.Path.String()), t.Flags, t.Size, t.Perm) } -func (t *MountTmpfsOp) Is(op Op) bool { vt, ok := op.(*MountTmpfsOp); return ok && *t == *vt } +func (t *MountTmpfsOp) Is(op Op) bool { + vt, ok := op.(*MountTmpfsOp) + return ok && ((t == nil && vt == nil) || + (t.Path != nil && vt.Path != nil && t.Path.Is(vt.Path)) && + t.FSName == vt.FSName && t.Flags == vt.Flags && t.Size == vt.Size && t.Perm == vt.Perm) +} func (*MountTmpfsOp) prefix() string { return "mounting" } func (t *MountTmpfsOp) String() string { return fmt.Sprintf("tmpfs on %q size %d", t.Path, t.Size) } diff --git a/container/inittmpfs_test.go b/container/inittmpfs_test.go new file mode 100644 index 0000000..c36820c --- /dev/null +++ b/container/inittmpfs_test.go @@ -0,0 +1,134 @@ +package container + +import ( + "syscall" + "testing" +) + +func TestMountTmpfsOp(t *testing.T) { + checkOpsBuilder(t, []opsBuilderTestCase{ + {"runtime", new(Ops).Tmpfs( + MustAbs("/run/user"), + 1<<10, + 0755, + ), Ops{ + &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, + }}, + + {"nscd", new(Ops).Readonly( + MustAbs("/var/run/nscd"), + 0755, + ), Ops{ + &MountTmpfsOp{ + FSName: "readonly", + Path: MustAbs("/var/run/nscd"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV | syscall.MS_RDONLY, + Perm: 0755, + }, + }}, + }) + + checkOpIs(t, []opIsTestCase{ + {"zero", new(MountTmpfsOp), new(MountTmpfsOp), false}, + + {"fsname differs", &MountTmpfsOp{ + FSName: "readonly", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, false}, + + {"path differs", &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user/differs"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, false}, + + {"flags differs", &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV | syscall.MS_RDONLY, + Size: 1 << 10, + Perm: 0755, + }, &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, false}, + + {"size differs", &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1, + Perm: 0755, + }, &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, false}, + + {"perm differs", &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0700, + }, &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, false}, + + {"equals", &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, true}, + }) + + checkOpMeta(t, []opMetaTestCase{ + {"runtime", &MountTmpfsOp{ + FSName: "ephemeral", + Path: MustAbs("/run/user"), + Flags: syscall.MS_NOSUID | syscall.MS_NODEV, + Size: 1 << 10, + Perm: 0755, + }, "mounting", `tmpfs on "/run/user" size 1024`}, + }) +}