// Program psx-signals validates that the psx mechanism can coexist // with Go use of signals. This is an unprivilaged program derived // from the sample code provided in this bug report: // // https://bugzilla.kernel.org/show_bug.cgi?id=210533 package main import ( "fmt" "log" "os" "os/signal" "syscall" "time" "kernel.org/pub/linux/libs/security/libcap/psx" ) const maxSig = 10 const prSetKeepCaps = 8 func main() { sig := make(chan os.Signal, maxSig) signal.Notify(sig, os.Interrupt) fmt.Print("Toggling KEEP_CAPS ") for i := 0; i < maxSig; i++ { fmt.Print(".") _, _, err := psx.Syscall3(syscall.SYS_PRCTL, prSetKeepCaps, uintptr(i&1), 0) if err != 0 { log.Fatalf("[%d] attempt to set KEEPCAPS (to %d) failed: %v", i, i%2, err) } } fmt.Println(" done") fmt.Print("Wait 1 second to see if unwanted signals arrive...") // Confirm no signals are delivered. select { case <-time.After(1 * time.Second): break case info := <-sig: log.Fatalf("signal received: %v", info) } fmt.Println(" none arrived") fmt.Println("PASSED") }