xref: /kernel/linux/linux-5.10/drivers/misc/lkdtm/cfi.c (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * This is for all the tests relating directly to Control Flow Integrity.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci#include "lkdtm.h"
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cistatic int called_count;
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci/* Function taking one argument, without a return value. */
108c2ecf20Sopenharmony_cistatic noinline void lkdtm_increment_void(int *counter)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	(*counter)++;
138c2ecf20Sopenharmony_ci}
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci/* Function taking one argument, returning int. */
168c2ecf20Sopenharmony_cistatic noinline int lkdtm_increment_int(int *counter)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	(*counter)++;
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	return *counter;
218c2ecf20Sopenharmony_ci}
228c2ecf20Sopenharmony_ci/*
238c2ecf20Sopenharmony_ci * This tries to call an indirect function with a mismatched prototype.
248c2ecf20Sopenharmony_ci */
258c2ecf20Sopenharmony_civoid lkdtm_CFI_FORWARD_PROTO(void)
268c2ecf20Sopenharmony_ci{
278c2ecf20Sopenharmony_ci	/*
288c2ecf20Sopenharmony_ci	 * Matches lkdtm_increment_void()'s prototype, but not
298c2ecf20Sopenharmony_ci	 * lkdtm_increment_int()'s prototype.
308c2ecf20Sopenharmony_ci	 */
318c2ecf20Sopenharmony_ci	void (*func)(int *);
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	pr_info("Calling matched prototype ...\n");
348c2ecf20Sopenharmony_ci	func = lkdtm_increment_void;
358c2ecf20Sopenharmony_ci	func(&called_count);
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	pr_info("Calling mismatched prototype ...\n");
388c2ecf20Sopenharmony_ci	func = (void *)lkdtm_increment_int;
398c2ecf20Sopenharmony_ci	func(&called_count);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	pr_info("Fail: survived mismatched prototype function call!\n");
428c2ecf20Sopenharmony_ci}
43