1*2810ac1bSKiyoung Kim// Program b215283 requires privilege to execute and is a minimally adapted 2*2810ac1bSKiyoung Kim// version of a test case provided by Lorenz Bauer as a reproducer for a 3*2810ac1bSKiyoung Kim// problem he found and reported in: 4*2810ac1bSKiyoung Kim// 5*2810ac1bSKiyoung Kim// https://bugzilla.kernel.org/show_bug.cgi?id=215283 6*2810ac1bSKiyoung Kimpackage main 7*2810ac1bSKiyoung Kim 8*2810ac1bSKiyoung Kimimport ( 9*2810ac1bSKiyoung Kim "fmt" 10*2810ac1bSKiyoung Kim "os" 11*2810ac1bSKiyoung Kim 12*2810ac1bSKiyoung Kim "kernel.org/pub/linux/libs/security/libcap/cap" 13*2810ac1bSKiyoung Kim) 14*2810ac1bSKiyoung Kim 15*2810ac1bSKiyoung Kimfunc main() { 16*2810ac1bSKiyoung Kim const secbits = cap.SecbitNoRoot | cap.SecbitNoSetUIDFixup 17*2810ac1bSKiyoung Kim 18*2810ac1bSKiyoung Kim if v, err := cap.GetProc().GetFlag(cap.Permitted, cap.SETPCAP); err != nil { 19*2810ac1bSKiyoung Kim panic(fmt.Sprintf("failed to get flag value: %v", err)) 20*2810ac1bSKiyoung Kim os.Exit(1) 21*2810ac1bSKiyoung Kim } else if !v { 22*2810ac1bSKiyoung Kim fmt.Printf("test requires cap_setpcap: found %q\n", cap.GetProc()) 23*2810ac1bSKiyoung Kim os.Exit(1) 24*2810ac1bSKiyoung Kim } 25*2810ac1bSKiyoung Kim if bits := cap.GetSecbits(); bits != 0 { 26*2810ac1bSKiyoung Kim fmt.Printf("test expects secbits=0 to run; found: 0%o\n", bits) 27*2810ac1bSKiyoung Kim os.Exit(1) 28*2810ac1bSKiyoung Kim } 29*2810ac1bSKiyoung Kim 30*2810ac1bSKiyoung Kim fmt.Println("secbits:", cap.GetSecbits(), " caps:", cap.GetProc()) 31*2810ac1bSKiyoung Kim 32*2810ac1bSKiyoung Kim l := cap.FuncLauncher(func(interface{}) error { 33*2810ac1bSKiyoung Kim return cap.NewSet().SetProc() 34*2810ac1bSKiyoung Kim }) 35*2810ac1bSKiyoung Kim 36*2810ac1bSKiyoung Kim if _, err := l.Launch(nil); err != nil { 37*2810ac1bSKiyoung Kim fmt.Printf("launch failed: %v\n", err) 38*2810ac1bSKiyoung Kim os.Exit(1) 39*2810ac1bSKiyoung Kim } 40*2810ac1bSKiyoung Kim 41*2810ac1bSKiyoung Kim fmt.Println("secbits:", cap.GetSecbits(), " caps:", cap.GetProc()) 42*2810ac1bSKiyoung Kim 43*2810ac1bSKiyoung Kim if err := secbits.Set(); err != nil { 44*2810ac1bSKiyoung Kim fmt.Printf("set securebits: %v", err.Error()) 45*2810ac1bSKiyoung Kim os.Exit(1) 46*2810ac1bSKiyoung Kim } 47*2810ac1bSKiyoung Kim} 48