diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-08-20 19:55:51 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-08-20 19:55:51 +0900 |
| commit | 51304b03af49efc66926f259507aa3a208535890 (patch) | |
| tree | d77924bfbb96889d71b965ce3e6dafd5841d5517 | |
| parent | c6397b941fe0c07795d8fd8615c37268c08082cd (diff) | |
container/initremount: check path equivalence by value
Fixes regression introduced while integrating Absolute.
Signed-off-by: Ophestra <cat@gensokyo.uk>
| -rw-r--r-- | container/initremount.go | 7 | ||||
| -rw-r--r-- | container/initremount_test.go | 52 |
2 files changed, 58 insertions, 1 deletions
diff --git a/container/initremount.go b/container/initremount.go index 2b290af0..77efc21d 100644 --- a/container/initremount.go +++ b/container/initremount.go @@ -29,6 +29,11 @@ func (r *RemountOp) apply(*setupState) error { fmt.Sprintf("cannot remount %q:", r.Target)) } -func (r *RemountOp) Is(op Op) bool { vr, ok := op.(*RemountOp); return ok && *r == *vr } +func (r *RemountOp) Is(op Op) bool { + vr, ok := op.(*RemountOp) + return ok && ((r == nil && vr == nil) || + (r.Target != nil && vr.Target != nil && r.Target.Is(vr.Target)) && + r.Flags == vr.Flags) +} func (*RemountOp) prefix() string { return "remounting" } func (r *RemountOp) String() string { return fmt.Sprintf("%q flags %#x", r.Target, r.Flags) } diff --git a/container/initremount_test.go b/container/initremount_test.go new file mode 100644 index 00000000..a59160b9 --- /dev/null +++ b/container/initremount_test.go @@ -0,0 +1,52 @@ +package container + +import ( + "syscall" + "testing" +) + +func TestRemountOp(t *testing.T) { + checkOpsBuilder(t, []opsBuilderTestCase{ + {"root", new(Ops).Remount(MustAbs("/"), syscall.MS_RDONLY), Ops{ + &RemountOp{ + Target: MustAbs("/"), + Flags: syscall.MS_RDONLY, + }, + }}, + }) + + checkOpIs(t, []opIsTestCase{ + {"zero", new(RemountOp), new(RemountOp), false}, + + {"target differs", &RemountOp{ + Target: MustAbs("/dev/"), + Flags: syscall.MS_RDONLY, + }, &RemountOp{ + Target: MustAbs("/"), + Flags: syscall.MS_RDONLY, + }, false}, + + {"flags differs", &RemountOp{ + Target: MustAbs("/"), + Flags: syscall.MS_RDONLY | syscall.MS_NODEV, + }, &RemountOp{ + Target: MustAbs("/"), + Flags: syscall.MS_RDONLY, + }, false}, + + {"equals", &RemountOp{ + Target: MustAbs("/"), + Flags: syscall.MS_RDONLY, + }, &RemountOp{ + Target: MustAbs("/"), + Flags: syscall.MS_RDONLY, + }, true}, + }) + + checkOpMeta(t, []opMetaTestCase{ + {"root", &RemountOp{ + Target: MustAbs("/"), + Flags: syscall.MS_RDONLY, + }, "remounting", `"/" flags 0x1`}, + }) +} |
