#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # A static branch key owned by a module is rejected whether the key is global # or file-local. # # The rejection matters because late module patching allows the livepatch # module to load before the module it depends on: the __jump_table klp reloc is # then unresolved, and jump_label_add_module() dereferences an uninitialized # pointer. Catching it at build time is the only defence. # # test-jump-label-module-key covers the global key. A file-local one reaches # the same check by a different route: the compiler emits the reference against # the section symbol plus an addend, so validate_special_section_klp_reloc() # has to resolve it to the underlying object before it can see a key at all. # Until it did, a static key was passed over as "not STT_OBJECT" and the # unsupported reference was emitted with nothing said. # # Fixed by f9fb44b0ecef ("objtool/klp: Fix detection of corrupt static # branch/call entries"). . "$(dirname "$0")/../lib.sh" setup build_pair jump_label.c -DSTATIC_KEY -DMODNAME='"klp_testmod"' require_input_section __jump_table # The premise: the key is reached through its section symbol, not by name. # Without that this is just a second copy of test-jump-label-module-key. input_jump_relocs="$(in_relocs orig.o | awk '/rela__jump_table/,/^$/')" echo "$input_jump_relocs" | grep -q klp_test_key || fail "fixture produced no __jump_table reference to the key" echo "$input_jump_relocs" | grep -qE '\.(bss|data)\.klp_test_key' || probe_skip "compiler referenced the static key by name, not through its section" run_diff 255 diff_log | grep -q 'unsupported static branch key klp_test_key' || fail "expected rejection, got: $(diff_log | tail -1)" [ -e "$workdir/out.o" ] && fail "output object produced for a rejected input" pass "module-owned file-local static branch key rejected"