Home | History | Annotate | Download | only in minijail
      1 /* 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.
      4  */
      5 
      6 #define USE_RET_KILL 0
      7 #define USE_RET_TRAP 1
      8 
      9 #define NO_LOGGING  0
     10 #define USE_LOGGING 1
     11 
     12 /* BPF testing macros. */
     13 #define EXPECT_EQ_BLOCK(_block, _code, _k, _jt, _jf)	\
     14 do {	\
     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) \
     25 do {	\
     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) \
     31 do {	\
     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 
     37 #define EXPECT_ACTUAL_LBL(_block, _id) \
     38 do {	\
     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 
     45 #define EXPECT_JUMP_LBL(_block) \
     46 do {	\
     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) \
     53 do {	\
     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) \
     60 do {	\
     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) \
     67 do {	\
     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) \
     74 do {	\
     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) \
     82 do {	\
     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) \
     90 do {	\
     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) \
     98 do {	\
     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)
    104