All checks were successful
		
		
	
	Test / Hakurei (push) Successful in 42s
				
			Test / Sandbox (push) Successful in 39s
				
			Test / Hakurei (race detector) (push) Successful in 41s
				
			Test / Create distribution (push) Successful in 33s
				
			Test / Sandbox (race detector) (push) Successful in 39s
				
			Test / Planterette (push) Successful in 41s
				
			Test / Flake checks (push) Successful in 1m17s
				
			This change also makes seccomp hashes cross-platform. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			88 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
//go:build testtool
 | 
						|
 | 
						|
package sandbox
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"syscall"
 | 
						|
	"unsafe"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	NULL = 0
 | 
						|
 | 
						|
	PTRACE_ATTACH             = 16
 | 
						|
	PTRACE_DETACH             = 17
 | 
						|
	PTRACE_SECCOMP_GET_FILTER = 0x420c
 | 
						|
)
 | 
						|
 | 
						|
type ptraceError struct {
 | 
						|
	op    string
 | 
						|
	errno syscall.Errno
 | 
						|
}
 | 
						|
 | 
						|
func (p *ptraceError) Error() string { return fmt.Sprintf("%s: %v", p.op, p.errno) }
 | 
						|
 | 
						|
func (p *ptraceError) Unwrap() error {
 | 
						|
	if p.errno == 0 {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	return p.errno
 | 
						|
}
 | 
						|
 | 
						|
func ptrace(op uintptr, pid, addr int, data unsafe.Pointer) (r uintptr, errno syscall.Errno) {
 | 
						|
	r, _, errno = syscall.Syscall6(syscall.SYS_PTRACE, op, uintptr(pid), uintptr(addr), uintptr(data), NULL, NULL)
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func ptraceAttach(pid int) error {
 | 
						|
	if _, errno := ptrace(PTRACE_ATTACH, pid, 0, nil); errno != 0 {
 | 
						|
		return &ptraceError{"PTRACE_ATTACH", errno}
 | 
						|
	}
 | 
						|
 | 
						|
	var status syscall.WaitStatus
 | 
						|
	for {
 | 
						|
		if _, err := syscall.Wait4(pid, &status, syscall.WALL, nil); err != nil {
 | 
						|
			if errors.Is(err, syscall.EINTR) {
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			fatalf("cannot waitpid: %v", err)
 | 
						|
		}
 | 
						|
		break
 | 
						|
	}
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func ptraceDetach(pid int) error {
 | 
						|
	if _, errno := ptrace(PTRACE_DETACH, pid, 0, nil); errno != 0 {
 | 
						|
		return &ptraceError{"PTRACE_DETACH", errno}
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
type sockFilter struct { /* Filter block */
 | 
						|
	code uint16 /* Actual filter code */
 | 
						|
	jt   uint8  /* Jump true */
 | 
						|
	jf   uint8  /* Jump false */
 | 
						|
	k    uint32 /* Generic multiuse field */
 | 
						|
}
 | 
						|
 | 
						|
func getFilter[T comparable](pid, index int) ([]T, error) {
 | 
						|
	if s := unsafe.Sizeof(*new(T)); s != 8 {
 | 
						|
		panic(fmt.Sprintf("invalid filter block size %d", s))
 | 
						|
	}
 | 
						|
 | 
						|
	var buf []T
 | 
						|
	if n, errno := ptrace(PTRACE_SECCOMP_GET_FILTER, pid, index, nil); errno != 0 {
 | 
						|
		return nil, &ptraceError{"PTRACE_SECCOMP_GET_FILTER", errno}
 | 
						|
	} else {
 | 
						|
		buf = make([]T, n)
 | 
						|
	}
 | 
						|
	if _, errno := ptrace(PTRACE_SECCOMP_GET_FILTER, pid, index, unsafe.Pointer(&buf[0])); errno != 0 {
 | 
						|
		return nil, &ptraceError{"PTRACE_SECCOMP_GET_FILTER", errno}
 | 
						|
	}
 | 
						|
	return buf, nil
 | 
						|
}
 |