blob: a653cbd1fffaf5e3e03411ce42b6d638ac5bd8b5 [file] [log] [blame]
Mike Frysinger50e31fa2018-01-19 18:59:49 -05001/* Copyright 2016 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
Jorge Lucangeli Obes106d97f2016-08-19 12:34:02 -04004 */
5
Jorge Lucangeli Obes713f6fb2016-10-03 13:03:25 -04006#define USE_RET_KILL 0
7#define USE_RET_TRAP 1
8
9#define NO_LOGGING 0
10#define USE_LOGGING 1
11
Jorge Lucangeli Obes106d97f2016-08-19 12:34:02 -040012/* BPF testing macros. */
13#define EXPECT_EQ_BLOCK(_block, _code, _k, _jt, _jf) \
14do { \
15 EXPECT_EQ((_block)->code, _code); \
16 EXPECT_EQ((_block)->k, (unsigned int)(_k)); \
17 EXPECT_EQ((_block)->jt, _jt); \
18 EXPECT_EQ((_block)->jf, _jf); \
19} while (0)
20
21#define EXPECT_EQ_STMT(_block, _code, _k) \
22 EXPECT_EQ_BLOCK(_block, _code, _k, 0, 0)
23
24#define EXPECT_COMP(_block) \
25do { \
26 EXPECT_EQ((_block)->len, BPF_ARG_COMP_LEN + 1); \
27 EXPECT_EQ((_block)->instrs->code, BPF_LD+BPF_W+BPF_ABS); \
28} while (0)
29
30#define EXPECT_LBL(_block) \
31do { \
32 EXPECT_TRUE((_block)->code == (BPF_JMP+BPF_JA)); \
33 EXPECT_TRUE((_block)->jt == LABEL_JT); \
34 EXPECT_TRUE((_block)->jf == LABEL_JF); \
35} while (0)
36
Jorge Lucangeli Obes45932a52017-03-15 17:02:58 -040037#define EXPECT_ACTUAL_LBL(_block, _id) \
38do { \
39 EXPECT_TRUE((_block)->code == (BPF_JMP+BPF_JA)); \
40 EXPECT_TRUE((_block)->k == (_id)); \
41 EXPECT_TRUE((_block)->jt == LABEL_JT); \
42 EXPECT_TRUE((_block)->jf == LABEL_JF); \
43} while (0)
44
Jorge Lucangeli Obes106d97f2016-08-19 12:34:02 -040045#define EXPECT_JUMP_LBL(_block) \
46do { \
47 EXPECT_EQ((_block)->code, BPF_JMP+BPF_JA); \
48 EXPECT_EQ((_block)->jt, JUMP_JT); \
49 EXPECT_EQ((_block)->jf, JUMP_JF); \
50} while (0)
51
52#define EXPECT_GROUP_END(_block) \
53do { \
54 EXPECT_EQ((_block)->len, 2U); \
55 EXPECT_JUMP_LBL(&(_block)->instrs[0]); \
56 EXPECT_LBL(&(_block)->instrs[1]); \
57} while (0)
58
59#define EXPECT_KILL(_block) \
60do { \
61 EXPECT_EQ((_block)->len, 1U); \
62 EXPECT_EQ_STMT((_block)->instrs, \
63 BPF_RET+BPF_K, SECCOMP_RET_KILL); \
64} while (0)
65
66#define EXPECT_TRAP(_block) \
67do { \
68 EXPECT_EQ((_block)->len, 1U); \
69 EXPECT_EQ_STMT((_block)->instrs, \
70 BPF_RET+BPF_K, SECCOMP_RET_TRAP); \
71} while (0)
72
73#define EXPECT_ALLOW(_block) \
74do { \
75 EXPECT_EQ((_block)->len, 2U); \
76 EXPECT_LBL(&(_block)->instrs[0]); \
77 EXPECT_EQ_STMT(&(_block)->instrs[1], \
78 BPF_RET+BPF_K, SECCOMP_RET_ALLOW); \
79} while (0)
80
81#define EXPECT_ARCH_VALIDATION(_filter) \
82do { \
83 EXPECT_EQ_STMT(&(_filter)[0], BPF_LD+BPF_W+BPF_ABS, arch_nr); \
84 EXPECT_EQ_BLOCK(&(_filter)[1], \
85 BPF_JMP+BPF_JEQ+BPF_K, ARCH_NR, SKIP, NEXT); \
86 EXPECT_EQ_STMT(&(_filter)[2], BPF_RET+BPF_K, SECCOMP_RET_KILL); \
87} while (0)
88
89#define EXPECT_ALLOW_SYSCALL(_filter, _nr) \
90do { \
91 EXPECT_EQ_BLOCK(&(_filter)[0], \
92 BPF_JMP+BPF_JEQ+BPF_K, (_nr), NEXT, SKIP); \
93 EXPECT_EQ_STMT(&(_filter)[1], \
94 BPF_RET+BPF_K, SECCOMP_RET_ALLOW); \
95} while (0)
96
97#define EXPECT_ALLOW_SYSCALL_ARGS(_filter, _nr, _id, _jt, _jf) \
98do { \
99 EXPECT_EQ_BLOCK(&(_filter)[0], \
100 BPF_JMP+BPF_JEQ+BPF_K, (_nr), NEXT, SKIP); \
101 EXPECT_EQ_BLOCK(&(_filter)[1], \
102 BPF_JMP+BPF_JA, (_id), (_jt), (_jf)); \
103} while (0)