container/initoverlay: invalid argument type
All checks were successful
Test / Create distribution (push) Successful in 34s
Test / Sandbox (push) Successful in 1m46s
Test / Hakurei (push) Successful in 3m19s
Test / Hpkg (push) Successful in 3m32s
Test / Sandbox (race detector) (push) Successful in 4m13s
Test / Hakurei (race detector) (push) Successful in 5m20s
Test / Flake checks (push) Successful in 1m37s
All checks were successful
Test / Create distribution (push) Successful in 34s
Test / Sandbox (push) Successful in 1m46s
Test / Hakurei (push) Successful in 3m19s
Test / Hpkg (push) Successful in 3m32s
Test / Sandbox (race detector) (push) Successful in 4m13s
Test / Hakurei (race detector) (push) Successful in 5m20s
Test / Flake checks (push) Successful in 1m37s
This eliminates generic WrapErr from overlay. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
parent
1c7e634f09
commit
905b9f9785
@ -3,7 +3,6 @@ package container
|
|||||||
import (
|
import (
|
||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@ -19,6 +18,39 @@ const (
|
|||||||
|
|
||||||
func init() { gob.Register(new(MountOverlayOp)) }
|
func init() { gob.Register(new(MountOverlayOp)) }
|
||||||
|
|
||||||
|
const (
|
||||||
|
// OverlayEphemeralUnexpectedUpper is set when [MountOverlayOp.Work] is nil
|
||||||
|
// and [MountOverlayOp.Upper] holds an unexpected value.
|
||||||
|
OverlayEphemeralUnexpectedUpper = iota
|
||||||
|
// OverlayReadonlyLower is set when [MountOverlayOp.Lower] contains less than
|
||||||
|
// two entries when mounting readonly.
|
||||||
|
OverlayReadonlyLower
|
||||||
|
// OverlayEmptyLower is set when [MountOverlayOp.Lower] has length of zero.
|
||||||
|
OverlayEmptyLower
|
||||||
|
)
|
||||||
|
|
||||||
|
// OverlayArgumentError is returned for [MountOverlayOp] supplied with invalid argument.
|
||||||
|
type OverlayArgumentError struct {
|
||||||
|
Type uintptr
|
||||||
|
Value string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *OverlayArgumentError) Error() string {
|
||||||
|
switch e.Type {
|
||||||
|
case OverlayEphemeralUnexpectedUpper:
|
||||||
|
return fmt.Sprintf("upperdir has unexpected value %q", e.Value)
|
||||||
|
|
||||||
|
case OverlayReadonlyLower:
|
||||||
|
return "readonly overlay requires at least two lowerdir"
|
||||||
|
|
||||||
|
case OverlayEmptyLower:
|
||||||
|
return "overlay requires at least one lowerdir"
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("invalid overlay argument error %#x", e.Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Overlay appends an [Op] that mounts the overlay pseudo filesystem on [MountOverlayOp.Target].
|
// Overlay appends an [Op] that mounts the overlay pseudo filesystem on [MountOverlayOp.Target].
|
||||||
func (f *Ops) Overlay(target, state, work *Absolute, layers ...*Absolute) *Ops {
|
func (f *Ops) Overlay(target, state, work *Absolute, layers ...*Absolute) *Ops {
|
||||||
*f = append(*f, &MountOverlayOp{
|
*f = append(*f, &MountOverlayOp{
|
||||||
@ -89,7 +121,7 @@ func (o *MountOverlayOp) early(_ *setupState, k syscallDispatcher) error {
|
|||||||
o.ephemeral = true // intermediate root not yet available
|
o.ephemeral = true // intermediate root not yet available
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return msg.WrapErr(fs.ErrInvalid, fmt.Sprintf("upperdir has unexpected value %q", o.Upper))
|
return &OverlayArgumentError{OverlayEphemeralUnexpectedUpper, o.Upper.String()}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// readonly handled in apply
|
// readonly handled in apply
|
||||||
@ -152,12 +184,12 @@ func (o *MountOverlayOp) apply(state *setupState, k syscallDispatcher) error {
|
|||||||
|
|
||||||
if o.upper == zeroString && o.work == zeroString { // readonly
|
if o.upper == zeroString && o.work == zeroString { // readonly
|
||||||
if len(o.Lower) < 2 {
|
if len(o.Lower) < 2 {
|
||||||
return msg.WrapErr(fs.ErrInvalid, "readonly overlay requires at least two lowerdir")
|
return &OverlayArgumentError{OverlayReadonlyLower, zeroString}
|
||||||
}
|
}
|
||||||
// "upperdir=" and "workdir=" may be omitted. In that case the overlay will be read-only
|
// "upperdir=" and "workdir=" may be omitted. In that case the overlay will be read-only
|
||||||
} else {
|
} else {
|
||||||
if len(o.Lower) == 0 {
|
if len(o.Lower) == 0 {
|
||||||
return msg.WrapErr(fs.ErrInvalid, "overlay requires at least one lowerdir")
|
return &OverlayArgumentError{OverlayEmptyLower, zeroString}
|
||||||
}
|
}
|
||||||
options = append(options,
|
options = append(options,
|
||||||
OptionOverlayUpperdir+"="+o.upper,
|
OptionOverlayUpperdir+"="+o.upper,
|
||||||
|
@ -2,12 +2,38 @@ package container
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"io/fs"
|
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMountOverlayOp(t *testing.T) {
|
func TestMountOverlayOp(t *testing.T) {
|
||||||
|
t.Run("argument error", func(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
err *OverlayArgumentError
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{"unexpected upper", &OverlayArgumentError{OverlayEphemeralUnexpectedUpper, "/proc/"},
|
||||||
|
`upperdir has unexpected value "/proc/"`},
|
||||||
|
|
||||||
|
{"lower ro short", &OverlayArgumentError{OverlayReadonlyLower, zeroString},
|
||||||
|
"readonly overlay requires at least two lowerdir"},
|
||||||
|
|
||||||
|
{"lower short", &OverlayArgumentError{OverlayEmptyLower, zeroString},
|
||||||
|
"overlay requires at least one lowerdir"},
|
||||||
|
|
||||||
|
{"oob", &OverlayArgumentError{0xdeadbeef, zeroString},
|
||||||
|
"invalid overlay argument error 0xdeadbeef"},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
if got := tc.err.Error(); got != tc.want {
|
||||||
|
t.Errorf("Error: %q, want %q", got, tc.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
checkOpBehaviour(t, []opBehaviourTestCase{
|
checkOpBehaviour(t, []opBehaviourTestCase{
|
||||||
{"mkdirTemp invalid ephemeral", &Params{ParentPerm: 0705}, &MountOverlayOp{
|
{"mkdirTemp invalid ephemeral", &Params{ParentPerm: 0705}, &MountOverlayOp{
|
||||||
Target: MustAbs("/"),
|
Target: MustAbs("/"),
|
||||||
@ -16,7 +42,7 @@ func TestMountOverlayOp(t *testing.T) {
|
|||||||
MustAbs("/var/lib/planterette/app/org.chromium.Chromium@debian:f92c9052"),
|
MustAbs("/var/lib/planterette/app/org.chromium.Chromium@debian:f92c9052"),
|
||||||
},
|
},
|
||||||
Upper: MustAbs("/proc/"),
|
Upper: MustAbs("/proc/"),
|
||||||
}, nil, msg.WrapErr(fs.ErrInvalid, `upperdir has unexpected value "/proc/"`), nil, nil},
|
}, nil, &OverlayArgumentError{OverlayEphemeralUnexpectedUpper, "/proc/"}, nil, nil},
|
||||||
|
|
||||||
{"mkdirTemp upper ephemeral", &Params{ParentPerm: 0705}, &MountOverlayOp{
|
{"mkdirTemp upper ephemeral", &Params{ParentPerm: 0705}, &MountOverlayOp{
|
||||||
Target: MustAbs("/"),
|
Target: MustAbs("/"),
|
||||||
@ -81,7 +107,7 @@ func TestMountOverlayOp(t *testing.T) {
|
|||||||
{"evalSymlinks", expectArgs{"/mnt-root/nix/.ro-store"}, "/mnt-root/nix/.ro-store", nil},
|
{"evalSymlinks", expectArgs{"/mnt-root/nix/.ro-store"}, "/mnt-root/nix/.ro-store", nil},
|
||||||
}, nil, []kexpect{
|
}, nil, []kexpect{
|
||||||
{"mkdirAll", expectArgs{"/sysroot/nix/store", os.FileMode(0755)}, nil, nil},
|
{"mkdirAll", expectArgs{"/sysroot/nix/store", os.FileMode(0755)}, nil, nil},
|
||||||
}, msg.WrapErr(fs.ErrInvalid, "readonly overlay requires at least two lowerdir")},
|
}, &OverlayArgumentError{OverlayReadonlyLower, zeroString}},
|
||||||
|
|
||||||
{"success ro noPrefix", &Params{ParentPerm: 0755}, &MountOverlayOp{
|
{"success ro noPrefix", &Params{ParentPerm: 0755}, &MountOverlayOp{
|
||||||
Target: MustAbs("/nix/store"),
|
Target: MustAbs("/nix/store"),
|
||||||
@ -129,7 +155,7 @@ func TestMountOverlayOp(t *testing.T) {
|
|||||||
{"evalSymlinks", expectArgs{"/mnt-root/nix/.rw-store/work"}, "/mnt-root/nix/.rw-store/.work", nil},
|
{"evalSymlinks", expectArgs{"/mnt-root/nix/.rw-store/work"}, "/mnt-root/nix/.rw-store/.work", nil},
|
||||||
}, nil, []kexpect{
|
}, nil, []kexpect{
|
||||||
{"mkdirAll", expectArgs{"/sysroot/nix/store", os.FileMode(0700)}, nil, nil},
|
{"mkdirAll", expectArgs{"/sysroot/nix/store", os.FileMode(0700)}, nil, nil},
|
||||||
}, msg.WrapErr(fs.ErrInvalid, "overlay requires at least one lowerdir")},
|
}, &OverlayArgumentError{OverlayEmptyLower, zeroString}},
|
||||||
|
|
||||||
{"evalSymlinks upper", &Params{ParentPerm: 0700}, &MountOverlayOp{
|
{"evalSymlinks upper", &Params{ParentPerm: 0700}, &MountOverlayOp{
|
||||||
Target: MustAbs("/nix/store"),
|
Target: MustAbs("/nix/store"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user