Merge ce0c1c9265 ("Merge tag 'modules-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux") into android-mainline
Steps on the way to v6.9-rc1 Signed-off-by: Lee Jones <joneslee@google.com> Change-Id: Ibbc4017822d914b961034e2a14212eb44f234d80
This commit is contained in:
@@ -322,9 +322,9 @@ static inline struct module *mod_find(unsigned long addr, struct mod_tree_root *
|
||||
}
|
||||
#endif /* CONFIG_MODULES_TREE_LOOKUP */
|
||||
|
||||
void module_enable_ro(const struct module *mod, bool after_init);
|
||||
void module_enable_nx(const struct module *mod);
|
||||
void module_enable_x(const struct module *mod);
|
||||
int module_enable_rodata_ro(const struct module *mod, bool after_init);
|
||||
int module_enable_data_nx(const struct module *mod);
|
||||
int module_enable_text_rox(const struct module *mod);
|
||||
int module_enforce_rwx_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||
char *secstrings, struct module *mod);
|
||||
|
||||
|
||||
+16
-4
@@ -2604,7 +2604,9 @@ static noinline int do_init_module(struct module *mod)
|
||||
/* Switch to core kallsyms now init is done: kallsyms may be walking! */
|
||||
rcu_assign_pointer(mod->kallsyms, &mod->core_kallsyms);
|
||||
#endif
|
||||
module_enable_ro(mod, true);
|
||||
ret = module_enable_rodata_ro(mod, true);
|
||||
if (ret)
|
||||
goto fail_mutex_unlock;
|
||||
mod_tree_remove_init(mod);
|
||||
module_arch_freeing_init(mod);
|
||||
for_class_mod_mem_type(type, init) {
|
||||
@@ -2642,6 +2644,8 @@ static noinline int do_init_module(struct module *mod)
|
||||
|
||||
return 0;
|
||||
|
||||
fail_mutex_unlock:
|
||||
mutex_unlock(&module_mutex);
|
||||
fail_free_freeinit:
|
||||
kfree(freeinit);
|
||||
fail:
|
||||
@@ -2769,9 +2773,15 @@ static int complete_formation(struct module *mod, struct load_info *info)
|
||||
module_bug_finalize(info->hdr, info->sechdrs, mod);
|
||||
module_cfi_finalize(info->hdr, info->sechdrs, mod);
|
||||
|
||||
module_enable_ro(mod, false);
|
||||
module_enable_nx(mod);
|
||||
module_enable_x(mod);
|
||||
err = module_enable_rodata_ro(mod, false);
|
||||
if (err)
|
||||
goto out_strict_rwx;
|
||||
err = module_enable_data_nx(mod);
|
||||
if (err)
|
||||
goto out_strict_rwx;
|
||||
err = module_enable_text_rox(mod);
|
||||
if (err)
|
||||
goto out_strict_rwx;
|
||||
|
||||
/*
|
||||
* Mark state as coming so strong_try_module_get() ignores us,
|
||||
@@ -2782,6 +2792,8 @@ static int complete_formation(struct module *mod, struct load_info *info)
|
||||
|
||||
return 0;
|
||||
|
||||
out_strict_rwx:
|
||||
module_bug_cleanup(mod);
|
||||
out:
|
||||
mutex_unlock(&module_mutex);
|
||||
return err;
|
||||
|
||||
+41
-22
@@ -11,13 +11,16 @@
|
||||
#include <linux/set_memory.h>
|
||||
#include "internal.h"
|
||||
|
||||
static void module_set_memory(const struct module *mod, enum mod_mem_type type,
|
||||
int (*set_memory)(unsigned long start, int num_pages))
|
||||
static int module_set_memory(const struct module *mod, enum mod_mem_type type,
|
||||
int (*set_memory)(unsigned long start, int num_pages))
|
||||
{
|
||||
const struct module_memory *mod_mem = &mod->mem[type];
|
||||
|
||||
if (!mod_mem->base)
|
||||
return 0;
|
||||
|
||||
set_vm_flush_reset_perms(mod_mem->base);
|
||||
set_memory((unsigned long)mod_mem->base, mod_mem->size >> PAGE_SHIFT);
|
||||
return set_memory((unsigned long)mod_mem->base, mod_mem->size >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -26,37 +29,53 @@ static void module_set_memory(const struct module *mod, enum mod_mem_type type,
|
||||
* CONFIG_STRICT_MODULE_RWX because they are needed regardless of whether we
|
||||
* are strict.
|
||||
*/
|
||||
void module_enable_x(const struct module *mod)
|
||||
int module_enable_text_rox(const struct module *mod)
|
||||
{
|
||||
for_class_mod_mem_type(type, text)
|
||||
module_set_memory(mod, type, set_memory_x);
|
||||
for_class_mod_mem_type(type, text) {
|
||||
int ret;
|
||||
|
||||
if (IS_ENABLED(CONFIG_STRICT_MODULE_RWX))
|
||||
ret = module_set_memory(mod, type, set_memory_rox);
|
||||
else
|
||||
ret = module_set_memory(mod, type, set_memory_x);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void module_enable_ro(const struct module *mod, bool after_init)
|
||||
int module_enable_rodata_ro(const struct module *mod, bool after_init)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX))
|
||||
return;
|
||||
#ifdef CONFIG_STRICT_MODULE_RWX
|
||||
if (!rodata_enabled)
|
||||
return;
|
||||
#endif
|
||||
int ret;
|
||||
|
||||
module_set_memory(mod, MOD_TEXT, set_memory_ro);
|
||||
module_set_memory(mod, MOD_INIT_TEXT, set_memory_ro);
|
||||
module_set_memory(mod, MOD_RODATA, set_memory_ro);
|
||||
module_set_memory(mod, MOD_INIT_RODATA, set_memory_ro);
|
||||
if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX) || !rodata_enabled)
|
||||
return 0;
|
||||
|
||||
ret = module_set_memory(mod, MOD_RODATA, set_memory_ro);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = module_set_memory(mod, MOD_INIT_RODATA, set_memory_ro);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (after_init)
|
||||
module_set_memory(mod, MOD_RO_AFTER_INIT, set_memory_ro);
|
||||
return module_set_memory(mod, MOD_RO_AFTER_INIT, set_memory_ro);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void module_enable_nx(const struct module *mod)
|
||||
int module_enable_data_nx(const struct module *mod)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
for_class_mod_mem_type(type, data)
|
||||
module_set_memory(mod, type, set_memory_nx);
|
||||
for_class_mod_mem_type(type, data) {
|
||||
int ret = module_set_memory(mod, type, set_memory_nx);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int module_enforce_rwx_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||
|
||||
Reference in New Issue
Block a user