xref: /openbmc/linux/drivers/misc/lkdtm/cfi.c (revision 56cb61f7)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * This is for all the tests relating directly to Control Flow Integrity.
4  */
5 #include "lkdtm.h"
6 
7 static int called_count;
8 
9 /* Function taking one argument, without a return value. */
10 static noinline void lkdtm_increment_void(int *counter)
11 {
12 	(*counter)++;
13 }
14 
15 /* Function taking one argument, returning int. */
16 static noinline int lkdtm_increment_int(int *counter)
17 {
18 	(*counter)++;
19 
20 	return *counter;
21 }
22 /*
23  * This tries to call an indirect function with a mismatched prototype.
24  */
25 void lkdtm_CFI_FORWARD_PROTO(void)
26 {
27 	/*
28 	 * Matches lkdtm_increment_void()'s prototype, but not
29 	 * lkdtm_increment_int()'s prototype.
30 	 */
31 	void (*func)(int *);
32 
33 	pr_info("Calling matched prototype ...\n");
34 	func = lkdtm_increment_void;
35 	func(&called_count);
36 
37 	pr_info("Calling mismatched prototype ...\n");
38 	func = (void *)lkdtm_increment_int;
39 	func(&called_count);
40 
41 	pr_err("FAIL: survived mismatched prototype function call!\n");
42 	pr_expected_config(CONFIG_CFI_CLANG);
43 }
44