summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-08-21 13:11:56 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-08-21 13:11:56 -0700
commit26260251022fbc2f248a3d747a9b2b961b18d2d8 (patch)
tree1b3b1225ba9ad4d1489f641e8ea0ea701a9cf7c3
parent2f0f6b0773be0a1ec475097ae54848eea42adc7d (diff)
parente77f165d26f72c280654cff248f5106cb9a53951 (diff)
Merge tag 'livepatching-for-7.3' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatchingHEADmaster
Pull livepatching updates from Petr Mladek: - Move consistency checks to catch missing func->old_name before the first access - Allow to run livepatching selftests from top-level directory * tag 'livepatching-for-7.3' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching: kbuild: unset sub_make_done before calling kselftest build system livepatch: Fix NULL pointer dereference in klp_find_func()
-rw-r--r--Makefile4
-rw-r--r--kernel/livepatch/core.c34
2 files changed, 24 insertions, 14 deletions
diff --git a/Makefile b/Makefile
index 130926fa592e..3d58dfa97791 100644
--- a/Makefile
+++ b/Makefile
@@ -1600,10 +1600,10 @@ tools/%: FORCE
PHONY += kselftest
kselftest: headers
- $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests run_tests
+ $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests run_tests
kselftest-%: headers FORCE
- $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests $*
+ $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests $*
PHONY += kselftest-merge
kselftest-merge:
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 28d15ba58a26..a240d1144e89 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -799,9 +799,6 @@ void klp_free_replaced_patches_async(struct klp_patch *new_patch)
static int klp_init_func(struct klp_object *obj, struct klp_func *func)
{
- if (!func->old_name)
- return -EINVAL;
-
/*
* NOPs get the address later. The patched module must be loaded,
* see klp_init_object_loaded().
@@ -1092,6 +1089,25 @@ err:
return ret;
}
+static int klp_check_patch(struct klp_patch *patch)
+{
+ struct klp_object *obj;
+ struct klp_func *func;
+
+ if (!patch || !patch->mod || !patch->objs)
+ return -EINVAL;
+
+ klp_for_each_object_static(patch, obj) {
+ if (!obj->funcs)
+ return -EINVAL;
+ klp_for_each_func_static(obj, func) {
+ if (!func->old_name)
+ return -EINVAL;
+ }
+ }
+ return 0;
+}
+
/**
* klp_enable_patch() - enable the livepatch
* @patch: patch to be enabled
@@ -1108,16 +1124,10 @@ err:
int klp_enable_patch(struct klp_patch *patch)
{
int ret;
- struct klp_object *obj;
-
- if (!patch || !patch->mod || !patch->objs)
- return -EINVAL;
-
- klp_for_each_object_static(patch, obj) {
- if (!obj->funcs)
- return -EINVAL;
- }
+ ret = klp_check_patch(patch);
+ if (ret)
+ return ret;
if (!is_livepatch_module(patch->mod)) {
pr_err("module %s is not marked as a livepatch module\n",