aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/livepatch
diff options
context:
space:
mode:
authorZhou Chengming <zhouchengming1@huawei.com>2015-11-06 01:25:00 -0500
committerJiri Kosina <jkosina@suse.cz>2015-11-11 11:36:04 -0500
commite41b104c7dba92443e594e6bc86e4b0bf1cdf573 (patch)
tree1793ed3dbe6268a7e153afb60812e1d85b84c18f /kernel/livepatch
parent99aaa9c64be5fe728975109c96ef297f5650883d (diff)
livepatch: x86: fix relocation computation with kASLR
With kASLR enabled, old_addr provided by patch module is being shifted accrodingly so that the symbol lookups work. To have module relocations handled properly as well, the same transformation needs to be perfomed on relocation address information. [jkosina@suse.cz: extended / reworded changelog a bit] Reported-by: Cyril B. <cbay@alwaysdata.com> Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'kernel/livepatch')
-rw-r--r--kernel/livepatch/core.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 6e5344112419..db545cbcdb89 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -294,6 +294,12 @@ static int klp_write_object_relocations(struct module *pmod,
294 294
295 for (reloc = obj->relocs; reloc->name; reloc++) { 295 for (reloc = obj->relocs; reloc->name; reloc++) {
296 if (!klp_is_module(obj)) { 296 if (!klp_is_module(obj)) {
297
298#if defined(CONFIG_RANDOMIZE_BASE)
299 /* If KASLR has been enabled, adjust old value accordingly */
300 if (kaslr_enabled())
301 reloc->val += kaslr_offset();
302#endif
297 ret = klp_verify_vmlinux_symbol(reloc->name, 303 ret = klp_verify_vmlinux_symbol(reloc->name,
298 reloc->val); 304 reloc->val);
299 if (ret) 305 if (ret)