1*2810ac1bSKiyoung Kim// Program psx-signals validates that the psx mechanism can coexist 2*2810ac1bSKiyoung Kim// with Go use of signals. This is an unprivilaged program derived 3*2810ac1bSKiyoung Kim// from the sample code provided in this bug report: 4*2810ac1bSKiyoung Kim// 5*2810ac1bSKiyoung Kim// https://bugzilla.kernel.org/show_bug.cgi?id=210533 6*2810ac1bSKiyoung Kimpackage main 7*2810ac1bSKiyoung Kim 8*2810ac1bSKiyoung Kimimport ( 9*2810ac1bSKiyoung Kim "fmt" 10*2810ac1bSKiyoung Kim "log" 11*2810ac1bSKiyoung Kim "os" 12*2810ac1bSKiyoung Kim "os/signal" 13*2810ac1bSKiyoung Kim "syscall" 14*2810ac1bSKiyoung Kim "time" 15*2810ac1bSKiyoung Kim 16*2810ac1bSKiyoung Kim "kernel.org/pub/linux/libs/security/libcap/psx" 17*2810ac1bSKiyoung Kim) 18*2810ac1bSKiyoung Kim 19*2810ac1bSKiyoung Kimconst maxSig = 10 20*2810ac1bSKiyoung Kimconst prSetKeepCaps = 8 21*2810ac1bSKiyoung Kim 22*2810ac1bSKiyoung Kimfunc main() { 23*2810ac1bSKiyoung Kim sig := make(chan os.Signal, maxSig) 24*2810ac1bSKiyoung Kim signal.Notify(sig, os.Interrupt) 25*2810ac1bSKiyoung Kim 26*2810ac1bSKiyoung Kim fmt.Print("Toggling KEEP_CAPS ") 27*2810ac1bSKiyoung Kim for i := 0; i < maxSig; i++ { 28*2810ac1bSKiyoung Kim fmt.Print(".") 29*2810ac1bSKiyoung Kim _, _, err := psx.Syscall3(syscall.SYS_PRCTL, prSetKeepCaps, uintptr(i&1), 0) 30*2810ac1bSKiyoung Kim if err != 0 { 31*2810ac1bSKiyoung Kim log.Fatalf("[%d] attempt to set KEEPCAPS (to %d) failed: %v", i, i%2, err) 32*2810ac1bSKiyoung Kim } 33*2810ac1bSKiyoung Kim } 34*2810ac1bSKiyoung Kim 35*2810ac1bSKiyoung Kim fmt.Println(" done") 36*2810ac1bSKiyoung Kim fmt.Print("Wait 1 second to see if unwanted signals arrive...") 37*2810ac1bSKiyoung Kim // Confirm no signals are delivered. 38*2810ac1bSKiyoung Kim select { 39*2810ac1bSKiyoung Kim case <-time.After(1 * time.Second): 40*2810ac1bSKiyoung Kim break 41*2810ac1bSKiyoung Kim case info := <-sig: 42*2810ac1bSKiyoung Kim log.Fatalf("signal received: %v", info) 43*2810ac1bSKiyoung Kim } 44*2810ac1bSKiyoung Kim fmt.Println(" none arrived") 45*2810ac1bSKiyoung Kim fmt.Println("PASSED") 46*2810ac1bSKiyoung Kim} 47