diff options
author | David Howells <dhowells@redhat.com> | 2010-08-17 18:52:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-17 21:07:43 -0400 |
commit | d7627467b7a8dd6944885290a03a07ceb28c10eb (patch) | |
tree | a18c83468418e878cfb2d44e4310d81b8db84ad7 /include/linux | |
parent | da5cabf80e2433131bf0ed8993abc0f7ea618c73 (diff) |
Make do_execve() take a const filename pointer
Make do_execve() take a const filename pointer so that kernel_execve() compiles
correctly on ARM:
arch/arm/kernel/sys_arm.c:88: warning: passing argument 1 of 'do_execve' discards qualifiers from pointer target type
This also requires the argv and envp arguments to be consted twice, once for
the pointer array and once for the strings the array points to. This is
because do_execve() passes a pointer to the filename (now const) to
copy_strings_kernel(). A simpler alternative would be to cast the filename
pointer in do_execve() when it's passed to copy_strings_kernel().
do_execve() may not change any of the strings it is passed as part of the argv
or envp lists as they are some of them in .rodata, so marking these strings as
const should be fine.
Further kernel_execve() and sys_execve() need to be changed to match.
This has been test built on x86_64, frv, arm and mips.
Signed-off-by: David Howells <dhowells@redhat.com>
Tested-by: Ralf Baechle <ralf@linux-mips.org>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/binfmts.h | 7 | ||||
-rw-r--r-- | include/linux/sched.h | 4 | ||||
-rw-r--r-- | include/linux/syscalls.h | 2 |
3 files changed, 8 insertions, 5 deletions
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index c809e286d213..a065612fc928 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h | |||
@@ -50,8 +50,8 @@ struct linux_binprm{ | |||
50 | int unsafe; /* how unsafe this exec is (mask of LSM_UNSAFE_*) */ | 50 | int unsafe; /* how unsafe this exec is (mask of LSM_UNSAFE_*) */ |
51 | unsigned int per_clear; /* bits to clear in current->personality */ | 51 | unsigned int per_clear; /* bits to clear in current->personality */ |
52 | int argc, envc; | 52 | int argc, envc; |
53 | char * filename; /* Name of binary as seen by procps */ | 53 | const char * filename; /* Name of binary as seen by procps */ |
54 | char * interp; /* Name of the binary really executed. Most | 54 | const char * interp; /* Name of the binary really executed. Most |
55 | of the time same as filename, but could be | 55 | of the time same as filename, but could be |
56 | different for binfmt_{misc,script} */ | 56 | different for binfmt_{misc,script} */ |
57 | unsigned interp_flags; | 57 | unsigned interp_flags; |
@@ -126,7 +126,8 @@ extern int setup_arg_pages(struct linux_binprm * bprm, | |||
126 | unsigned long stack_top, | 126 | unsigned long stack_top, |
127 | int executable_stack); | 127 | int executable_stack); |
128 | extern int bprm_mm_init(struct linux_binprm *bprm); | 128 | extern int bprm_mm_init(struct linux_binprm *bprm); |
129 | extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm); | 129 | extern int copy_strings_kernel(int argc, const char *const *argv, |
130 | struct linux_binprm *bprm); | ||
130 | extern int prepare_bprm_creds(struct linux_binprm *bprm); | 131 | extern int prepare_bprm_creds(struct linux_binprm *bprm); |
131 | extern void install_exec_creds(struct linux_binprm *bprm); | 132 | extern void install_exec_creds(struct linux_binprm *bprm); |
132 | extern void do_coredump(long signr, int exit_code, struct pt_regs *regs); | 133 | extern void do_coredump(long signr, int exit_code, struct pt_regs *regs); |
diff --git a/include/linux/sched.h b/include/linux/sched.h index ce160d68f5e7..1e2a6db2d7dd 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2109,7 +2109,9 @@ extern void daemonize(const char *, ...); | |||
2109 | extern int allow_signal(int); | 2109 | extern int allow_signal(int); |
2110 | extern int disallow_signal(int); | 2110 | extern int disallow_signal(int); |
2111 | 2111 | ||
2112 | extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *); | 2112 | extern int do_execve(const char *, |
2113 | const char __user * const __user *, | ||
2114 | const char __user * const __user *, struct pt_regs *); | ||
2113 | extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); | 2115 | extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); |
2114 | struct task_struct *fork_idle(int); | 2116 | struct task_struct *fork_idle(int); |
2115 | 2117 | ||
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 6e5d19788634..e6319d18a55d 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -820,7 +820,7 @@ asmlinkage long sys_fanotify_mark(int fanotify_fd, unsigned int flags, | |||
820 | u64 mask, int fd, | 820 | u64 mask, int fd, |
821 | const char __user *pathname); | 821 | const char __user *pathname); |
822 | 822 | ||
823 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]); | 823 | int kernel_execve(const char *filename, const char *const argv[], const char *const envp[]); |
824 | 824 | ||
825 | 825 | ||
826 | asmlinkage long sys_perf_event_open( | 826 | asmlinkage long sys_perf_event_open( |