--- zzzz-none-000/linux-4.4.271/arch/arm/kernel/module.c 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/arch/arm/kernel/module.c 2023-04-19 10:22:27.000000000 +0000 @@ -12,10 +12,12 @@ */ #include #include +#include #include #include #include #include +#include #include #include #include @@ -40,11 +42,23 @@ #ifdef CONFIG_MMU void *module_alloc(unsigned long size) { - void *p = __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, - GFP_KERNEL, PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE, + unsigned long gfp_flags = GFP_KERNEL; + void *p; + + if (IS_ENABLED(CONFIG_ARM_MODULE_PLTS)) + gfp_flags = gfp_flags | __GFP_NOWARN; + + p = __vmalloc_node_range(size, MODULE_ALIGN, MODULES_VADDR, MODULES_END, + gfp_flags, PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE, __builtin_return_address(0)); + if (p && (kasan_module_alloc(p, size) < 0)) { + vfree(p); + return NULL; + } + if (!IS_ENABLED(CONFIG_ARM_MODULE_PLTS) || p) return p; + return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, GFP_KERNEL, PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE, __builtin_return_address(0)); @@ -88,6 +102,10 @@ return -ENOEXEC; } + if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) && + ELF_ST_BIND(sym->st_info) == STB_WEAK) + continue; + loc = dstsec->sh_addr + rel->r_offset; switch (ELF32_R_TYPE(rel->r_info)) {