All checks were successful
Test / Create distribution (push) Successful in 1m4s
Test / Sandbox (push) Successful in 2m43s
Test / Hakurei (push) Successful in 3m49s
Test / ShareFS (push) Successful in 3m55s
Test / Sandbox (race detector) (push) Successful in 5m18s
Test / Hakurei (race detector) (push) Successful in 6m25s
Test / Flake checks (push) Successful in 1m22s
This arranges for binfmt entries to be registered for the container. Signed-off-by: Ophestra <cat@gensokyo.uk>
47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package container
|
|
|
|
import (
|
|
"strings"
|
|
"unsafe"
|
|
|
|
"hakurei.app/check"
|
|
)
|
|
|
|
// escapeBinfmt escapes magic/mask sequences in a [BinfmtEntry].
|
|
func escapeBinfmt(buf *strings.Builder, s string) string {
|
|
const lowerhex = "0123456789abcdef"
|
|
|
|
buf.Reset()
|
|
for _, c := range unsafe.Slice(unsafe.StringData(s), len(s)) {
|
|
switch c {
|
|
case 0, '\\', ':':
|
|
buf.WriteString(`\x`)
|
|
buf.WriteByte(lowerhex[c>>4])
|
|
buf.WriteByte(lowerhex[c&0xf])
|
|
|
|
default:
|
|
buf.WriteByte(c)
|
|
}
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
// BinfmtEntry is an entry to be registered by the init process.
|
|
type BinfmtEntry struct {
|
|
// The offset of the magic/mask in the file, counted in bytes.
|
|
Offset byte
|
|
// The byte sequence binfmt_misc is matching for.
|
|
Magic string
|
|
// An (optional, defaults to all 0xff) mask.
|
|
Mask string
|
|
// The program that should be invoked with the binary as first argument.
|
|
Interpreter *check.Absolute
|
|
}
|
|
|
|
// Valid returns whether e can be registered into the kernel.
|
|
func (e *BinfmtEntry) Valid() bool {
|
|
return e != nil &&
|
|
int(e.Offset)+max(len(e.Magic), len(e.Mask)) < 128 &&
|
|
e.Interpreter != nil && len(e.Interpreter.String()) < 128
|
|
}
|