All checks were successful
Test / Create distribution (push) Successful in 37s
Test / Create distribution (pull_request) Successful in 33s
Test / Sandbox (push) Successful in 2m13s
Test / Sandbox (pull_request) Successful in 2m10s
Test / Hpkg (pull_request) Successful in 4m2s
Test / Hpkg (push) Successful in 4m11s
Test / Sandbox (race detector) (pull_request) Successful in 4m15s
Test / Sandbox (race detector) (push) Successful in 4m22s
Test / Hakurei (pull_request) Successful in 4m39s
Test / Hakurei (race detector) (push) Successful in 5m3s
Test / Hakurei (race detector) (pull_request) Successful in 4m57s
Test / Flake checks (pull_request) Successful in 1m25s
Test / Hakurei (push) Successful in 38s
Test / Flake checks (push) Successful in 1m23s
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package container
|
|
|
|
/*
|
|
#include <linux/landlock.h>
|
|
#include <sys/syscall.h>
|
|
*/
|
|
import "C"
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"hakurei.app/container/seccomp"
|
|
)
|
|
|
|
const (
|
|
LANDLOCK_CREATE_RULESET_VERSION = C.LANDLOCK_CREATE_RULESET_VERSION
|
|
LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET = C.LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET
|
|
LANDLOCK_SCOPE_SIGNAL = C.LANDLOCK_SCOPE_SIGNAL
|
|
)
|
|
|
|
type RulesetAttr = C.struct_landlock_ruleset_attr
|
|
|
|
func NewRulesetAttr(scoped int) RulesetAttr { return RulesetAttr{scoped: C.__u64(scoped)} }
|
|
|
|
/* TODO: remove everything above this */
|
|
|
|
func LandlockCreateRuleset(rulesetAttr *RulesetAttr, flags uintptr) (fd int, err error) {
|
|
var pointer, size uintptr
|
|
// NULL needed for abi version
|
|
if rulesetAttr != nil {
|
|
pointer = uintptr(unsafe.Pointer(rulesetAttr))
|
|
size = unsafe.Sizeof(*rulesetAttr)
|
|
}
|
|
|
|
rulesetFd, _, errno := syscall.Syscall(seccomp.SYS_LANDLOCK_CREATE_RULESET, pointer, size, flags)
|
|
fd = int(rulesetFd)
|
|
err = errno
|
|
|
|
if fd < 0 {
|
|
return
|
|
}
|
|
|
|
if rulesetAttr != nil { // not a fd otherwise
|
|
syscall.CloseOnExec(fd)
|
|
}
|
|
return fd, nil
|
|
}
|
|
|
|
func LandlockGetABI() (int, error) {
|
|
return LandlockCreateRuleset(nil, LANDLOCK_CREATE_RULESET_VERSION)
|
|
}
|
|
|
|
func LandlockRestrictSelf(rulesetFd int, flags uintptr) error {
|
|
r, _, errno := syscall.Syscall(seccomp.SYS_LANDLOCK_RESTRICT_SELF, uintptr(rulesetFd), flags, 0)
|
|
if r != 0 {
|
|
return errno
|
|
}
|
|
return nil
|
|
}
|