| #!/bin/bash | |
| # SPDX-License-Identifier: GPL-2.0 | |
| # | |
| # A reference the patch adds has no counterpart in the original object. klp | |
| # diff used to reject any such reference needing a klp relocation, which ruled | |
| # out patches that call something they did not call before -- a common enough | |
| # thing for a fix to do. | |
| # | |
| # Module.symvers is what makes it safe: it says the symbol exists and who owns | |
| # it. But that is only sufficient for a vmlinux export. A new reference to a | |
| # module's export is a dependency the patch module does not declare, and the | |
| # relocation would resolve only if that module happened to be loaded, so it | |
| # stays an error. | |
| . "$(dirname "$0")/../lib.sh" | |
| setup | |
| build_pair new_export_ref.c | |
| # Exported by vmlinux, in a module: namespace so it needs a klp relocation | |
| # rather than an ordinary one. Allowed. | |
| export_syms | |
| add_exports_ns vmlinux module:kvm newly_referenced | |
| run_diff | |
| assert_klp_sym newly_referenced vmlinux | |
| # Exported by a module the patched object does not depend on. Rejected, and | |
| # for that reason rather than some other. | |
| export_syms | |
| add_exports other_mod newly_referenced | |
| run_diff 255 | |
| assert_diff_log 'undeclared module dependency' | |
| # ... unless the original already referenced something that module exports. | |
| # The loader will not let the patched object load without other_mod, so the | |
| # klp relocation has something to resolve against, and klp diff allows it. | |
| # This is the other half of the rule, and it fails in the opposite direction: | |
| # refusing here would reject a patch which is safe to apply. | |
| rm -f "$workdir/out.o" | |
| build_pair new_export_ref.c -DEXISTING_DEP | |
| export_syms | |
| add_exports other_mod newly_referenced existing_dep | |
| run_diff | |
| assert_klp_sym newly_referenced other_mod | |
| pass "new reference allowed for vmlinux and for a module already depended on" |