|  | 
| 3 | 3 | 
 | 
| 4 | 4 | #include <linux/bpf.h> | 
| 5 | 5 | #include <bpf/bpf_helpers.h> | 
|  | 6 | +#include "../../../include/linux/filter.h" | 
| 6 | 7 | #include "bpf_misc.h" | 
| 7 | 8 | 
 | 
| 8 | 9 | #define MAX_ENTRIES 11 | 
| @@ -183,4 +184,32 @@ __naked void flow_keys_illegal_variable_offset_alu(void) | 
| 183 | 184 | 	: __clobber_all); | 
| 184 | 185 | } | 
| 185 | 186 | 
 | 
|  | 187 | +#define DEFINE_BAD_OFFSET_TEST(name, op, off, imm)	\ | 
|  | 188 | +	SEC("socket")					\ | 
|  | 189 | +	__failure __msg("BPF_ALU uses reserved fields") \ | 
|  | 190 | +	__naked void name(void)				\ | 
|  | 191 | +	{						\ | 
|  | 192 | +		asm volatile(				\ | 
|  | 193 | +			"r0 = 1;"			\ | 
|  | 194 | +			".8byte %[insn];"		\ | 
|  | 195 | +			"r0 = 0;"			\ | 
|  | 196 | +			"exit;"				\ | 
|  | 197 | +		:					\ | 
|  | 198 | +		: __imm_insn(insn, BPF_RAW_INSN((op), 0, 0, (off), (imm))) \ | 
|  | 199 | +		: __clobber_all);			\ | 
|  | 200 | +	} | 
|  | 201 | + | 
|  | 202 | +/* | 
|  | 203 | + * Offset fields of 0 and 1 are legal for BPF_{DIV,MOD} instructions. | 
|  | 204 | + * Offset fields of 0 are legal for the rest of ALU instructions. | 
|  | 205 | + * Test that error is reported for illegal offsets, assuming that tests | 
|  | 206 | + * for legal offsets exist. | 
|  | 207 | + */ | 
|  | 208 | +DEFINE_BAD_OFFSET_TEST(bad_offset_divx, BPF_ALU64 | BPF_DIV | BPF_X, -1, 0) | 
|  | 209 | +DEFINE_BAD_OFFSET_TEST(bad_offset_modk, BPF_ALU64 | BPF_MOD | BPF_K, -1, 1) | 
|  | 210 | +DEFINE_BAD_OFFSET_TEST(bad_offset_addx, BPF_ALU64 | BPF_ADD | BPF_X, -1, 0) | 
|  | 211 | +DEFINE_BAD_OFFSET_TEST(bad_offset_divx2, BPF_ALU64 | BPF_DIV | BPF_X, 2, 0) | 
|  | 212 | +DEFINE_BAD_OFFSET_TEST(bad_offset_modk2, BPF_ALU64 | BPF_MOD | BPF_K, 2, 1) | 
|  | 213 | +DEFINE_BAD_OFFSET_TEST(bad_offset_addx2, BPF_ALU64 | BPF_ADD | BPF_X, 1, 0) | 
|  | 214 | + | 
| 186 | 215 | char _license[] SEC("license") = "GPL"; | 
0 commit comments