aboutsummaryrefslogtreecommitdiffhomepage
path: root/container
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-20 17:14:36 +0900
committerOphestra <cat@gensokyo.uk>2025-08-20 17:14:36 +0900
commit97ab24feef0d3cb1da063a910e477823b693fba0 (patch)
tree43a1a6134729854842431f2a14a11e25fde3aa77 /container
parent31f0dd36df3ad5574ac4e9cab19b943f5c129ea2 (diff)
container/init: use absolute compare method
More checks are also added. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container')
-rw-r--r--container/autoroot.go3
-rw-r--r--container/autoroot_test.go22
-rw-r--r--container/initbind.go6
-rw-r--r--container/initbind_test.go18
-rw-r--r--container/initdev.go3
-rw-r--r--container/initdev_test.go19
-rw-r--r--container/initmkdir.go3
-rw-r--r--container/initmkdir_test.go3
8 files changed, 58 insertions, 19 deletions
diff --git a/container/autoroot.go b/container/autoroot.go
index 640d72d1..a7a3f33c 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 77440ace..5a77435e 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 17cd9598..0b34851e 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 dec9113a..f0792613 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 c06cf224..71c30f42 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 3df56d51..0d6ea5af 100644
--- a/container/initdev_test.go
+++ b/container/initdev_test.go
@@ -22,30 +22,37 @@ func TestMountDevOp(t *testing.T) {
checkOpIs(t, []opIsTestCase{
{"zero", new(MountDevOp), new(MountDevOp), false},
- {"equals", &MountDevOp{
+ {"write differs", &MountDevOp{
Target: MustAbs("/dev/"),
Mqueue: true,
}, &MountDevOp{
Target: MustAbs("/dev/"),
Mqueue: true,
- }, true},
+ Write: true,
+ }, false},
- {"differs", &MountDevOp{
+ {"mqueue differs", &MountDevOp{
Target: MustAbs("/dev/"),
- Mqueue: true,
}, &MountDevOp{
Target: MustAbs("/dev/"),
Mqueue: true,
- Write: true,
}, false},
- {"differs path", &MountDevOp{
+ {"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 3043df9f..6153106b 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 89058a85..d5c6f0ba 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},
})