Add a macro to check whether an address is within module's text. Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxxxxxx> --- include/linux/module.h | 13 +++++++++++++ kernel/module.c | 17 +++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/include/linux/module.h b/include/linux/module.h index 33b4db8f5ca5..fc7adb110a81 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -570,6 +570,19 @@ static inline bool within_range(unsigned long addr, void *base, unsigned int siz return addr >= (unsigned long)base && addr < (unsigned long)base + size; } +static inline bool within_module_layout_text(unsigned long addr, + const struct module_layout *layout) +{ + return within_range(addr, layout->base, layout->text_size); +} + +static inline bool within_module_text(unsigned long addr, + const struct module *mod) +{ + return within_module_layout_text(addr, &mod->core_layout) || + within_module_layout_text(addr, &mod->init_layout); +} + static inline bool within_module_layout(unsigned long addr, const struct module_layout *layout) { diff --git a/kernel/module.c b/kernel/module.c index 84a9141a5e15..201d27643c84 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -4224,11 +4224,6 @@ SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags) return load_module(&info, uargs, flags); } -static inline int within(unsigned long addr, void *start, unsigned long size) -{ - return ((void *)addr >= start && (void *)addr < start + size); -} - #ifdef CONFIG_KALLSYMS /* * This ignores the intensely annoying "mapping symbols" found @@ -4765,13 +4760,11 @@ bool is_module_text_address(unsigned long addr) struct module *__module_text_address(unsigned long addr) { struct module *mod = __module_address(addr); - if (mod) { - /* Make sure it's within the text section. */ - if (!within(addr, mod->init_layout.base, mod->init_layout.text_size) - && !within(addr, mod->core_layout.base, mod->core_layout.text_size)) - mod = NULL; - } - return mod; + + if (mod && within_module_text(addr, mod)) + return mod; + + return NULL; } /* Don't grab lock, we're oopsing. */ -- 2.33.1