Commit a0c9db1e authored by Zheng Yejian's avatar Zheng Yejian
Browse files

livepatch: Fix crash when access the global variable in hook

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8MGE6


CVE: NA

--------------------------------

Livepatch allows users to call hook functions to perform some customized
operations when insmod the .ko. During the test, it is found that in the
ARM64 architecture, if accesses the global variables defined by other ko in
hook functions, a crash occurs.

Since relocation is performed during the livepatch insertion, instructions
in the icache should be invalid. If the instructions in the icache are
directly obtained, incorrect addresses may be obtained, caseing crash.
Therefore, flush the icache before calling the hook functions.

Signed-off-by: default avatarYe Weihua <yeweihua4@huawei.com>
Signed-off-by: default avatarZheng Yejian <zhengyejian1@huawei.com>
parent 315bed18
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -121,6 +121,8 @@ void module_arch_cleanup(struct module *mod);
/* Any cleanup before freeing mod->module_init */
void module_arch_freeing_init(struct module *mod);

void flush_module_icache(const struct module *mod);

#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \
		!defined(CONFIG_KASAN_VMALLOC)
#include <linux/kasan.h>
+1 −0
Original line number Diff line number Diff line
@@ -1060,6 +1060,7 @@ static int klp_init_patch(struct klp_patch *patch)
	}

#ifdef CONFIG_LIVEPATCH_WO_FTRACE
	flush_module_icache(patch->mod);
	set_mod_klp_rel_state(patch->mod, MODULE_KLP_REL_DONE);
	ret = jump_label_register(patch->mod);
	if (ret) {
+1 −1
Original line number Diff line number Diff line
@@ -2317,7 +2317,7 @@ static int check_export_symbol_versions(struct module *mod)
	return 0;
}

static void flush_module_icache(const struct module *mod)
void flush_module_icache(const struct module *mod)
{
	/*
	 * Flush the instruction cache, since we've played with text.