#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # Under kCFI an indirect call checks a type hash before jumping, and traps on a # mismatch. Two things belong to the calling function and must come with it # into a patch: # # - the __cfi_ prefix symbol holding the hash. Lose it and the patched # function has no type identity, so indirect calls to it trap. # - its .kcfi_traps entry. Lose that and the trap is not recognised as a # CFI failure, so what should be a clean report becomes an oops. # # Neither shows up at build time. . "$(dirname "$0")/../lib.sh" clang_only "kCFI is a Clang feature" setup # Declared above that this is Clang's; a given Clang may still be too old. cc_supports -fsanitize=kcfi || probe_skip "this clang does not support -fsanitize=kcfi" build_pair kcfi.c -fsanitize=kcfi assert_input_section .kcfi_traps assert_input_symbol __cfi_target run_diff assert_patched target # The prefix symbol comes with its function ... assert_symbol __cfi_target # ... and so does the trap entry. assert_section .kcfi_traps pass "kCFI prefix symbol and trap entry carried with the patched function"