xref: /aosp_15_r20/external/libcap/go/b215283.go (revision 2810ac1b38eead2603277920c78344c84ddf3aff)
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