From af5dd2f171c6a5014fff1b41decfdbda54ea4625 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 22 Oct 2012 18:09:41 +1030 Subject: [PATCH] BACKPORT: module: add flags arg to sys_finit_module() Thanks to Michael Kerrisk for keeping us honest. These flags are actually useful for eliminating the only case where kmod has to mangle a module's internals: for overriding module versioning. Signed-off-by: Rusty Russell Acked-by: Lucas De Marchi Acked-by: Kees Cook (backported from Rusty's modules-next tree) BUG=None, keeping us in sync with upstream for this API TEST=daisy build, manual testing CQ-DEPEND=I5b5a9bee3f9e73eb076f01e8aacee51eff095c56 Change-Id: I40f0b55ff903dda411a04b088f4ca5b6ab5cf05e Signed-off-by: Kees Cook Reviewed-on: https://gerrit.chromium.org/gerrit/37278 Reviewed-by: Mandeep Singh Baines --- include/linux/syscalls.h | 2 +- kernel/module.c | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index b91a19f5ecd..63e8205174d 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -859,7 +859,7 @@ asmlinkage long sys_process_vm_writev(pid_t pid, unsigned long riovcnt, unsigned long flags); -asmlinkage long sys_finit_module(int fd, const char __user *uargs); +asmlinkage long sys_finit_module(int fd, const char __user *uargs, int flags); asmlinkage long sys_seccomp(unsigned int op, unsigned int flags, const char __user *uargs); diff --git a/kernel/module.c b/kernel/module.c index c0268d2ae3f..27f667f978c 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3498,7 +3498,7 @@ static int init_module_permission(void) return 0; } -SYSCALL_DEFINE2(finit_module, int, fd, const char __user *, uargs) +SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags) { int err; struct load_info info = { }; @@ -3507,7 +3507,10 @@ SYSCALL_DEFINE2(finit_module, int, fd, const char __user *, uargs) if (err) return err; - pr_debug("finit_module: fd=%d, uargs=%p\n", fd, uargs); + pr_debug("finit_module: fd=%d, uargs=%p, flags=%i\n", fd, uargs, flags); + + if (flags) + return -EINVAL; if (fd < 0) return -ENOEXEC;