1 {
2 	"ARG_PTR_TO_LONG uninitialized",
3 	.insns = {
4 		/* bpf_strtoul arg1 (buf) */
5 		BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
6 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
7 		BPF_MOV64_IMM(BPF_REG_0, 0x00303036),
8 		BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
9 
10 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
11 
12 		/* bpf_strtoul arg2 (buf_len) */
13 		BPF_MOV64_IMM(BPF_REG_2, 4),
14 
15 		/* bpf_strtoul arg3 (flags) */
16 		BPF_MOV64_IMM(BPF_REG_3, 0),
17 
18 		/* bpf_strtoul arg4 (res) */
19 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
20 		BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
21 
22 		/* bpf_strtoul() */
23 		BPF_EMIT_CALL(BPF_FUNC_strtoul),
24 
25 		BPF_MOV64_IMM(BPF_REG_0, 1),
26 		BPF_EXIT_INSN(),
27 	},
28 	.result = REJECT,
29 	.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL,
30 	.errstr = "invalid indirect read from stack R4 off -16+0 size 8",
31 },
32 {
33 	"ARG_PTR_TO_LONG half-uninitialized",
34 	.insns = {
35 		/* bpf_strtoul arg1 (buf) */
36 		BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
37 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
38 		BPF_MOV64_IMM(BPF_REG_0, 0x00303036),
39 		BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
40 
41 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
42 
43 		/* bpf_strtoul arg2 (buf_len) */
44 		BPF_MOV64_IMM(BPF_REG_2, 4),
45 
46 		/* bpf_strtoul arg3 (flags) */
47 		BPF_MOV64_IMM(BPF_REG_3, 0),
48 
49 		/* bpf_strtoul arg4 (res) */
50 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
51 		BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0),
52 		BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
53 
54 		/* bpf_strtoul() */
55 		BPF_EMIT_CALL(BPF_FUNC_strtoul),
56 
57 		BPF_MOV64_IMM(BPF_REG_0, 1),
58 		BPF_EXIT_INSN(),
59 	},
60 	.result = REJECT,
61 	.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL,
62 	.errstr = "invalid indirect read from stack R4 off -16+4 size 8",
63 },
64 {
65 	"ARG_PTR_TO_LONG misaligned",
66 	.insns = {
67 		/* bpf_strtoul arg1 (buf) */
68 		BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
69 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
70 		BPF_MOV64_IMM(BPF_REG_0, 0x00303036),
71 		BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
72 
73 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
74 
75 		/* bpf_strtoul arg2 (buf_len) */
76 		BPF_MOV64_IMM(BPF_REG_2, 4),
77 
78 		/* bpf_strtoul arg3 (flags) */
79 		BPF_MOV64_IMM(BPF_REG_3, 0),
80 
81 		/* bpf_strtoul arg4 (res) */
82 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -12),
83 		BPF_MOV64_IMM(BPF_REG_0, 0),
84 		BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0),
85 		BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 4),
86 		BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
87 
88 		/* bpf_strtoul() */
89 		BPF_EMIT_CALL(BPF_FUNC_strtoul),
90 
91 		BPF_MOV64_IMM(BPF_REG_0, 1),
92 		BPF_EXIT_INSN(),
93 	},
94 	.result = REJECT,
95 	.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL,
96 	.errstr = "misaligned stack access off (0x0; 0x0)+-20+0 size 8",
97 },
98 {
99 	"ARG_PTR_TO_LONG size < sizeof(long)",
100 	.insns = {
101 		/* bpf_strtoul arg1 (buf) */
102 		BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
103 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -16),
104 		BPF_MOV64_IMM(BPF_REG_0, 0x00303036),
105 		BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
106 
107 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
108 
109 		/* bpf_strtoul arg2 (buf_len) */
110 		BPF_MOV64_IMM(BPF_REG_2, 4),
111 
112 		/* bpf_strtoul arg3 (flags) */
113 		BPF_MOV64_IMM(BPF_REG_3, 0),
114 
115 		/* bpf_strtoul arg4 (res) */
116 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, 12),
117 		BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0),
118 		BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
119 
120 		/* bpf_strtoul() */
121 		BPF_EMIT_CALL(BPF_FUNC_strtoul),
122 
123 		BPF_MOV64_IMM(BPF_REG_0, 1),
124 		BPF_EXIT_INSN(),
125 	},
126 	.result = REJECT,
127 	.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL,
128 	.errstr = "invalid indirect access to stack R4 off=-4 size=8",
129 },
130 {
131 	"ARG_PTR_TO_LONG initialized",
132 	.insns = {
133 		/* bpf_strtoul arg1 (buf) */
134 		BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
135 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
136 		BPF_MOV64_IMM(BPF_REG_0, 0x00303036),
137 		BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
138 
139 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
140 
141 		/* bpf_strtoul arg2 (buf_len) */
142 		BPF_MOV64_IMM(BPF_REG_2, 4),
143 
144 		/* bpf_strtoul arg3 (flags) */
145 		BPF_MOV64_IMM(BPF_REG_3, 0),
146 
147 		/* bpf_strtoul arg4 (res) */
148 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
149 		BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
150 		BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
151 
152 		/* bpf_strtoul() */
153 		BPF_EMIT_CALL(BPF_FUNC_strtoul),
154 
155 		BPF_MOV64_IMM(BPF_REG_0, 1),
156 		BPF_EXIT_INSN(),
157 	},
158 	.result = ACCEPT,
159 	.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL,
160 },
161