From 97ab24feef0d3cb1da063a910e477823b693fba0 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Wed, 20 Aug 2025 17:14:36 +0900 Subject: [PATCH] container/init: use absolute compare method More checks are also added. Signed-off-by: Ophestra --- container/autoroot.go | 3 +-- container/autoroot_test.go | 22 +++++++++++++++++++++- container/initbind.go | 6 ++---- container/initbind_test.go | 18 +++++++++++++++++- container/initdev.go | 3 +-- container/initdev_test.go | 27 +++++++++++++++++---------- container/initmkdir.go | 3 +-- container/initmkdir_test.go | 3 ++- 8 files changed, 62 insertions(+), 23 deletions(-) diff --git a/container/autoroot.go b/container/autoroot.go index 640d72d..a7a3f33 100644 --- a/container/autoroot.go +++ b/container/autoroot.go @@ -73,8 +73,7 @@ func (r *AutoRootOp) apply(state *setupState) error { func (r *AutoRootOp) Is(op Op) bool { vr, ok := op.(*AutoRootOp) return ok && ((r == nil && vr == nil) || (r != nil && vr != nil && - r.Host != nil && vr.Host != nil && - r.Host.String() == vr.Host.String() && + r.Host != nil && vr.Host != nil && r.Host.Is(vr.Host) && r.Prefix == vr.Prefix && r.Flags == vr.Flags)) } func (*AutoRootOp) prefix() string { return "setting up" } diff --git a/container/autoroot_test.go b/container/autoroot_test.go index 77440ac..5a77435 100644 --- a/container/autoroot_test.go +++ b/container/autoroot_test.go @@ -27,7 +27,7 @@ func TestAutoRootOp(t *testing.T) { resolved: []Op{new(BindMountOp)}, }, true}, - {"differs", &AutoRootOp{ + {"prefix differs", &AutoRootOp{ Host: MustAbs("/"), Prefix: "\x00", Flags: BindWritable, @@ -37,6 +37,26 @@ func TestAutoRootOp(t *testing.T) { Flags: BindWritable, }, false}, + {"flags differs", &AutoRootOp{ + Host: MustAbs("/"), + Prefix: ":3", + Flags: BindWritable | BindDevice, + }, &AutoRootOp{ + Host: MustAbs("/"), + Prefix: ":3", + Flags: BindWritable, + }, false}, + + {"host differs", &AutoRootOp{ + Host: MustAbs("/tmp/"), + Prefix: ":3", + Flags: BindWritable, + }, &AutoRootOp{ + Host: MustAbs("/"), + Prefix: ":3", + Flags: BindWritable, + }, false}, + {"equals", &AutoRootOp{ Host: MustAbs("/"), Prefix: ":3", diff --git a/container/initbind.go b/container/initbind.go index 17cd959..0b34851 100644 --- a/container/initbind.go +++ b/container/initbind.go @@ -88,10 +88,8 @@ func (b *BindMountOp) apply(*setupState) error { func (b *BindMountOp) Is(op Op) bool { vb, ok := op.(*BindMountOp) return ok && ((b == nil && vb == nil) || (b != nil && vb != nil && - b.Source != nil && vb.Source != nil && - b.Source.String() == vb.Source.String() && - b.Target != nil && vb.Target != nil && - b.Target.String() == vb.Target.String() && + b.Source != nil && vb.Source != nil && b.Source.Is(vb.Source) && + b.Target != nil && vb.Target != nil && b.Target.Is(vb.Target) && b.Flags == vb.Flags)) } func (*BindMountOp) prefix() string { return "mounting" } diff --git a/container/initbind_test.go b/container/initbind_test.go index dec9113..f079261 100644 --- a/container/initbind_test.go +++ b/container/initbind_test.go @@ -28,7 +28,7 @@ func TestBindMountOp(t *testing.T) { sourceFinal: MustAbs("/etc/"), }, true}, - {"differs", &BindMountOp{ + {"flags differs", &BindMountOp{ Source: MustAbs("/etc/"), Target: MustAbs("/etc/.host/048090b6ed8f9ebb10e275ff5d8c0659"), }, &BindMountOp{ @@ -37,6 +37,22 @@ func TestBindMountOp(t *testing.T) { Flags: BindOptional, }, false}, + {"source differs", &BindMountOp{ + Source: MustAbs("/.hakurei/etc/"), + Target: MustAbs("/etc/.host/048090b6ed8f9ebb10e275ff5d8c0659"), + }, &BindMountOp{ + Source: MustAbs("/etc/"), + Target: MustAbs("/etc/.host/048090b6ed8f9ebb10e275ff5d8c0659"), + }, false}, + + {"target differs", &BindMountOp{ + Source: MustAbs("/etc/"), + Target: MustAbs("/etc/.host/048090b6ed8f9ebb10e275ff5d8c0659"), + }, &BindMountOp{ + Source: MustAbs("/etc/"), + Target: MustAbs("/etc/"), + }, false}, + {"equals", &BindMountOp{ Source: MustAbs("/etc/"), Target: MustAbs("/etc/.host/048090b6ed8f9ebb10e275ff5d8c0659"), diff --git a/container/initdev.go b/container/initdev.go index c06cf22..71c30f4 100644 --- a/container/initdev.go +++ b/container/initdev.go @@ -129,8 +129,7 @@ func (d *MountDevOp) apply(state *setupState) error { func (d *MountDevOp) Is(op Op) bool { vd, ok := op.(*MountDevOp) return ok && ((d == nil && vd == nil) || (d != nil && vd != nil && - d.Target != nil && vd.Target != nil && - d.Target.String() == vd.Target.String() && + d.Target != nil && vd.Target != nil && d.Target.Is(vd.Target) && d.Mqueue == vd.Mqueue && d.Write == vd.Write)) } func (*MountDevOp) prefix() string { return "mounting" } diff --git a/container/initdev_test.go b/container/initdev_test.go index 3df56d5..0d6ea5a 100644 --- a/container/initdev_test.go +++ b/container/initdev_test.go @@ -22,15 +22,7 @@ func TestMountDevOp(t *testing.T) { checkOpIs(t, []opIsTestCase{ {"zero", new(MountDevOp), new(MountDevOp), false}, - {"equals", &MountDevOp{ - Target: MustAbs("/dev/"), - Mqueue: true, - }, &MountDevOp{ - Target: MustAbs("/dev/"), - Mqueue: true, - }, true}, - - {"differs", &MountDevOp{ + {"write differs", &MountDevOp{ Target: MustAbs("/dev/"), Mqueue: true, }, &MountDevOp{ @@ -39,13 +31,28 @@ func TestMountDevOp(t *testing.T) { Write: true, }, false}, - {"differs path", &MountDevOp{ + {"mqueue differs", &MountDevOp{ + Target: MustAbs("/dev/"), + }, &MountDevOp{ + Target: MustAbs("/dev/"), + Mqueue: true, + }, false}, + + {"target differs", &MountDevOp{ Target: MustAbs("/"), Mqueue: true, }, &MountDevOp{ Target: MustAbs("/dev/"), Mqueue: true, }, false}, + + {"equals", &MountDevOp{ + Target: MustAbs("/dev/"), + Mqueue: true, + }, &MountDevOp{ + Target: MustAbs("/dev/"), + Mqueue: true, + }, true}, }) checkOpMeta(t, []opMetaTestCase{ diff --git a/container/initmkdir.go b/container/initmkdir.go index 3043df9..6153106 100644 --- a/container/initmkdir.go +++ b/container/initmkdir.go @@ -32,8 +32,7 @@ func (m *MkdirOp) apply(*setupState) error { func (m *MkdirOp) Is(op Op) bool { vm, ok := op.(*MkdirOp) return ok && ((m == nil && vm == nil) || (m != nil && vm != nil && - m.Path != nil && vm.Path != nil && - m.Path.String() == vm.Path.String() && + m.Path != nil && vm.Path != nil && m.Path.Is(vm.Path) && m.Perm == vm.Perm)) } func (*MkdirOp) prefix() string { return "creating" } diff --git a/container/initmkdir_test.go b/container/initmkdir_test.go index 89058a8..d5c6f0b 100644 --- a/container/initmkdir_test.go +++ b/container/initmkdir_test.go @@ -11,7 +11,8 @@ func TestMkdirOp(t *testing.T) { checkOpIs(t, []opIsTestCase{ {"zero", new(MkdirOp), new(MkdirOp), false}, - {"differs", &MkdirOp{Path: MustAbs("/"), Perm: 0755}, &MkdirOp{Path: MustAbs("/etc/"), Perm: 0755}, false}, + {"path differs", &MkdirOp{Path: MustAbs("/"), Perm: 0755}, &MkdirOp{Path: MustAbs("/etc/"), Perm: 0755}, false}, + {"perm differs", &MkdirOp{Path: MustAbs("/")}, &MkdirOp{Path: MustAbs("/"), Perm: 0755}, false}, {"equals", &MkdirOp{Path: MustAbs("/")}, &MkdirOp{Path: MustAbs("/")}, true}, })