Commit d7627467b7a8dd6944885290a03a07ceb28c10eb
Committed by
Linus Torvalds
1 parent
da5cabf80e
Exists in
master
and in
7 other branches
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>
Showing 50 changed files with 179 additions and 98 deletions Side-by-side Diff
- arch/alpha/kernel/process.c
- arch/arm/kernel/sys_arm.c
- arch/avr32/kernel/process.c
- arch/avr32/kernel/sys_avr32.c
- arch/blackfin/kernel/process.c
- arch/cris/arch-v10/kernel/process.c
- arch/cris/arch-v32/kernel/process.c
- arch/frv/kernel/process.c
- arch/h8300/kernel/process.c
- arch/h8300/kernel/sys_h8300.c
- arch/ia64/kernel/process.c
- arch/m32r/kernel/process.c
- arch/m32r/kernel/sys_m32r.c
- arch/m68k/kernel/process.c
- arch/m68k/kernel/sys_m68k.c
- arch/m68knommu/kernel/process.c
- arch/m68knommu/kernel/sys_m68k.c
- arch/microblaze/kernel/sys_microblaze.c
- arch/mips/kernel/syscall.c
- arch/mn10300/kernel/process.c
- arch/parisc/hpux/fs.c
- arch/parisc/kernel/process.c
- arch/powerpc/kernel/process.c
- arch/s390/kernel/process.c
- arch/score/kernel/sys_score.c
- arch/sh/kernel/process_32.c
- arch/sh/kernel/process_64.c
- arch/sh/kernel/sys_sh32.c
- arch/sh/kernel/sys_sh64.c
- arch/sparc/kernel/process_32.c
- arch/sparc/kernel/process_64.c
- arch/sparc/kernel/sys_sparc_32.c
- arch/sparc/kernel/sys_sparc_64.c
- arch/tile/kernel/process.c
- arch/um/kernel/exec.c
- arch/um/kernel/syscall.c
- arch/x86/include/asm/syscalls.h
- arch/x86/kernel/process.c
- arch/x86/kernel/sys_i386_32.c
- arch/xtensa/kernel/process.c
- fs/binfmt_misc.c
- fs/binfmt_script.c
- fs/exec.c
- include/linux/binfmts.h
- include/linux/sched.h
- include/linux/syscalls.h
- init/do_mounts_initrd.c
- init/main.c
- kernel/kmod.c
- security/commoncap.c
arch/alpha/kernel/process.c
... | ... | @@ -387,8 +387,9 @@ |
387 | 387 | * sys_execve() executes a new program. |
388 | 388 | */ |
389 | 389 | asmlinkage int |
390 | -do_sys_execve(const char __user *ufilename, char __user * __user *argv, | |
391 | - char __user * __user *envp, struct pt_regs *regs) | |
390 | +do_sys_execve(const char __user *ufilename, | |
391 | + const char __user *const __user *argv, | |
392 | + const char __user *const __user *envp, struct pt_regs *regs) | |
392 | 393 | { |
393 | 394 | int error; |
394 | 395 | char *filename; |
arch/arm/kernel/sys_arm.c
... | ... | @@ -62,8 +62,9 @@ |
62 | 62 | /* sys_execve() executes a new program. |
63 | 63 | * This is called indirectly via a small wrapper |
64 | 64 | */ |
65 | -asmlinkage int sys_execve(const char __user *filenamei, char __user * __user *argv, | |
66 | - char __user * __user *envp, struct pt_regs *regs) | |
65 | +asmlinkage int sys_execve(const char __user *filenamei, | |
66 | + const char __user *const __user *argv, | |
67 | + const char __user *const __user *envp, struct pt_regs *regs) | |
67 | 68 | { |
68 | 69 | int error; |
69 | 70 | char * filename; |
70 | 71 | |
... | ... | @@ -78,14 +79,17 @@ |
78 | 79 | return error; |
79 | 80 | } |
80 | 81 | |
81 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
82 | +int kernel_execve(const char *filename, | |
83 | + const char *const argv[], | |
84 | + const char *const envp[]) | |
82 | 85 | { |
83 | 86 | struct pt_regs regs; |
84 | 87 | int ret; |
85 | 88 | |
86 | 89 | memset(®s, 0, sizeof(struct pt_regs)); |
87 | - ret = do_execve(filename, (char __user * __user *)argv, | |
88 | - (char __user * __user *)envp, ®s); | |
90 | + ret = do_execve(filename, | |
91 | + (const char __user *const __user *)argv, | |
92 | + (const char __user *const __user *)envp, ®s); | |
89 | 93 | if (ret < 0) |
90 | 94 | goto out; |
91 | 95 |
arch/avr32/kernel/process.c
... | ... | @@ -384,8 +384,9 @@ |
384 | 384 | } |
385 | 385 | |
386 | 386 | asmlinkage int sys_execve(const char __user *ufilename, |
387 | - char __user *__user *uargv, | |
388 | - char __user *__user *uenvp, struct pt_regs *regs) | |
387 | + const char __user *const __user *uargv, | |
388 | + const char __user *const __user *uenvp, | |
389 | + struct pt_regs *regs) | |
389 | 390 | { |
390 | 391 | int error; |
391 | 392 | char *filename; |
arch/avr32/kernel/sys_avr32.c
... | ... | @@ -7,7 +7,9 @@ |
7 | 7 | */ |
8 | 8 | #include <linux/unistd.h> |
9 | 9 | |
10 | -int kernel_execve(const char *file, char **argv, char **envp) | |
10 | +int kernel_execve(const char *file, | |
11 | + const char *const *argv, | |
12 | + const char *const *envp) | |
11 | 13 | { |
12 | 14 | register long scno asm("r8") = __NR_execve; |
13 | 15 | register long sc1 asm("r12") = (long)file; |
arch/blackfin/kernel/process.c
... | ... | @@ -209,7 +209,9 @@ |
209 | 209 | /* |
210 | 210 | * sys_execve() executes a new program. |
211 | 211 | */ |
212 | -asmlinkage int sys_execve(const char __user *name, char __user * __user *argv, char __user * __user *envp) | |
212 | +asmlinkage int sys_execve(const char __user *name, | |
213 | + const char __user *const __user *argv, | |
214 | + const char __user *const __user *envp) | |
213 | 215 | { |
214 | 216 | int error; |
215 | 217 | char *filename; |
arch/cris/arch-v10/kernel/process.c
... | ... | @@ -204,7 +204,9 @@ |
204 | 204 | /* |
205 | 205 | * sys_execve() executes a new program. |
206 | 206 | */ |
207 | -asmlinkage int sys_execve(const char *fname, char **argv, char **envp, | |
207 | +asmlinkage int sys_execve(const char *fname, | |
208 | + const char *const *argv, | |
209 | + const char *const *envp, | |
208 | 210 | long r13, long mof, long srp, |
209 | 211 | struct pt_regs *regs) |
210 | 212 | { |
arch/cris/arch-v32/kernel/process.c
... | ... | @@ -218,8 +218,10 @@ |
218 | 218 | |
219 | 219 | /* sys_execve() executes a new program. */ |
220 | 220 | asmlinkage int |
221 | -sys_execve(const char *fname, char **argv, char **envp, long r13, long mof, long srp, | |
222 | - struct pt_regs *regs) | |
221 | +sys_execve(const char *fname, | |
222 | + const char *const *argv, | |
223 | + const char *const *envp, long r13, long mof, long srp, | |
224 | + struct pt_regs *regs) | |
223 | 225 | { |
224 | 226 | int error; |
225 | 227 | char *filename; |
arch/frv/kernel/process.c
... | ... | @@ -250,8 +250,9 @@ |
250 | 250 | /* |
251 | 251 | * sys_execve() executes a new program. |
252 | 252 | */ |
253 | -asmlinkage int sys_execve(const char __user *name, char __user * __user *argv, | |
254 | - char __user * __user *envp) | |
253 | +asmlinkage int sys_execve(const char __user *name, | |
254 | + const char __user *const __user *argv, | |
255 | + const char __user *const __user *envp) | |
255 | 256 | { |
256 | 257 | int error; |
257 | 258 | char * filename; |
arch/h8300/kernel/process.c
... | ... | @@ -212,7 +212,10 @@ |
212 | 212 | /* |
213 | 213 | * sys_execve() executes a new program. |
214 | 214 | */ |
215 | -asmlinkage int sys_execve(const char *name, char **argv, char **envp,int dummy,...) | |
215 | +asmlinkage int sys_execve(const char *name, | |
216 | + const char *const *argv, | |
217 | + const char *const *envp, | |
218 | + int dummy, ...) | |
216 | 219 | { |
217 | 220 | int error; |
218 | 221 | char * filename; |
arch/h8300/kernel/sys_h8300.c
... | ... | @@ -51,7 +51,9 @@ |
51 | 51 | * Do a system call from kernel instead of calling sys_execve so we |
52 | 52 | * end up with proper pt_regs. |
53 | 53 | */ |
54 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
54 | +int kernel_execve(const char *filename, | |
55 | + const char *const argv[], | |
56 | + const char *const envp[]) | |
55 | 57 | { |
56 | 58 | register long res __asm__("er0"); |
57 | 59 | register char *const *_c __asm__("er3") = envp; |
arch/ia64/kernel/process.c
... | ... | @@ -633,7 +633,9 @@ |
633 | 633 | } |
634 | 634 | |
635 | 635 | long |
636 | -sys_execve (const char __user *filename, char __user * __user *argv, char __user * __user *envp, | |
636 | +sys_execve (const char __user *filename, | |
637 | + const char __user *const __user *argv, | |
638 | + const char __user *const __user *envp, | |
637 | 639 | struct pt_regs *regs) |
638 | 640 | { |
639 | 641 | char *fname; |
arch/m32r/kernel/process.c
... | ... | @@ -289,8 +289,8 @@ |
289 | 289 | * sys_execve() executes a new program. |
290 | 290 | */ |
291 | 291 | asmlinkage int sys_execve(const char __user *ufilename, |
292 | - char __user * __user *uargv, | |
293 | - char __user * __user *uenvp, | |
292 | + const char __user *const __user *uargv, | |
293 | + const char __user *const __user *uenvp, | |
294 | 294 | unsigned long r3, unsigned long r4, unsigned long r5, |
295 | 295 | unsigned long r6, struct pt_regs regs) |
296 | 296 | { |
arch/m32r/kernel/sys_m32r.c
... | ... | @@ -93,7 +93,9 @@ |
93 | 93 | * Do a system call from kernel instead of calling sys_execve so we |
94 | 94 | * end up with proper pt_regs. |
95 | 95 | */ |
96 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
96 | +int kernel_execve(const char *filename, | |
97 | + const char *const argv[], | |
98 | + const char *const envp[]) | |
97 | 99 | { |
98 | 100 | register long __scno __asm__ ("r7") = __NR_execve; |
99 | 101 | register long __arg3 __asm__ ("r2") = (long)(envp); |
arch/m68k/kernel/process.c
... | ... | @@ -315,7 +315,9 @@ |
315 | 315 | /* |
316 | 316 | * sys_execve() executes a new program. |
317 | 317 | */ |
318 | -asmlinkage int sys_execve(const char __user *name, char __user * __user *argv, char __user * __user *envp) | |
318 | +asmlinkage int sys_execve(const char __user *name, | |
319 | + const char __user *const __user *argv, | |
320 | + const char __user *const __user *envp) | |
319 | 321 | { |
320 | 322 | int error; |
321 | 323 | char * filename; |
arch/m68k/kernel/sys_m68k.c
... | ... | @@ -459,7 +459,9 @@ |
459 | 459 | * Do a system call from kernel instead of calling sys_execve so we |
460 | 460 | * end up with proper pt_regs. |
461 | 461 | */ |
462 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
462 | +int kernel_execve(const char *filename, | |
463 | + const char *const argv[], | |
464 | + const char *const envp[]) | |
463 | 465 | { |
464 | 466 | register long __res asm ("%d0") = __NR_execve; |
465 | 467 | register long __a asm ("%d1") = (long)(filename); |
arch/m68knommu/kernel/process.c
... | ... | @@ -350,7 +350,9 @@ |
350 | 350 | /* |
351 | 351 | * sys_execve() executes a new program. |
352 | 352 | */ |
353 | -asmlinkage int sys_execve(const char *name, char **argv, char **envp) | |
353 | +asmlinkage int sys_execve(const char *name, | |
354 | + const char *const *argv, | |
355 | + const char *const *envp) | |
354 | 356 | { |
355 | 357 | int error; |
356 | 358 | char * filename; |
arch/m68knommu/kernel/sys_m68k.c
... | ... | @@ -44,7 +44,9 @@ |
44 | 44 | * Do a system call from kernel instead of calling sys_execve so we |
45 | 45 | * end up with proper pt_regs. |
46 | 46 | */ |
47 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
47 | +int kernel_execve(const char *filename, | |
48 | + const char *const argv[], | |
49 | + const char *const envp[]) | |
48 | 50 | { |
49 | 51 | register long __res asm ("%d0") = __NR_execve; |
50 | 52 | register long __a asm ("%d1") = (long)(filename); |
arch/microblaze/kernel/sys_microblaze.c
... | ... | @@ -47,8 +47,10 @@ |
47 | 47 | return do_fork(flags, stack, regs, 0, NULL, NULL); |
48 | 48 | } |
49 | 49 | |
50 | -asmlinkage long microblaze_execve(const char __user *filenamei, char __user *__user *argv, | |
51 | - char __user *__user *envp, struct pt_regs *regs) | |
50 | +asmlinkage long microblaze_execve(const char __user *filenamei, | |
51 | + const char __user *const __user *argv, | |
52 | + const char __user *const __user *envp, | |
53 | + struct pt_regs *regs) | |
52 | 54 | { |
53 | 55 | int error; |
54 | 56 | char *filename; |
... | ... | @@ -77,7 +79,9 @@ |
77 | 79 | * Do a system call from kernel instead of calling sys_execve so we |
78 | 80 | * end up with proper pt_regs. |
79 | 81 | */ |
80 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
82 | +int kernel_execve(const char *filename, | |
83 | + const char *const argv[], | |
84 | + const char *const envp[]) | |
81 | 85 | { |
82 | 86 | register const char *__a __asm__("r5") = filename; |
83 | 87 | register const void *__b __asm__("r6") = argv; |
arch/mips/kernel/syscall.c
... | ... | @@ -258,8 +258,10 @@ |
258 | 258 | error = PTR_ERR(filename); |
259 | 259 | if (IS_ERR(filename)) |
260 | 260 | goto out; |
261 | - error = do_execve(filename, (char __user *__user *) (long)regs.regs[5], | |
262 | - (char __user *__user *) (long)regs.regs[6], ®s); | |
261 | + error = do_execve(filename, | |
262 | + (const char __user *const __user *) (long)regs.regs[5], | |
263 | + (const char __user *const __user *) (long)regs.regs[6], | |
264 | + ®s); | |
263 | 265 | putname(filename); |
264 | 266 | |
265 | 267 | out: |
... | ... | @@ -436,7 +438,9 @@ |
436 | 438 | * Do a system call from kernel instead of calling sys_execve so we |
437 | 439 | * end up with proper pt_regs. |
438 | 440 | */ |
439 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
441 | +int kernel_execve(const char *filename, | |
442 | + const char *const argv[], | |
443 | + const char *const envp[]) | |
440 | 444 | { |
441 | 445 | register unsigned long __a0 asm("$4") = (unsigned long) filename; |
442 | 446 | register unsigned long __a1 asm("$5") = (unsigned long) argv; |
arch/mn10300/kernel/process.c
... | ... | @@ -269,8 +269,8 @@ |
269 | 269 | } |
270 | 270 | |
271 | 271 | asmlinkage long sys_execve(const char __user *name, |
272 | - char __user * __user *argv, | |
273 | - char __user * __user *envp) | |
272 | + const char __user *const __user *argv, | |
273 | + const char __user *const __user *envp) | |
274 | 274 | { |
275 | 275 | char *filename; |
276 | 276 | int error; |
arch/parisc/hpux/fs.c
... | ... | @@ -41,8 +41,10 @@ |
41 | 41 | if (IS_ERR(filename)) |
42 | 42 | goto out; |
43 | 43 | |
44 | - error = do_execve(filename, (char __user * __user *) regs->gr[25], | |
45 | - (char __user * __user *) regs->gr[24], regs); | |
44 | + error = do_execve(filename, | |
45 | + (const char __user *const __user *) regs->gr[25], | |
46 | + (const char __user *const __user *) regs->gr[24], | |
47 | + regs); | |
46 | 48 | |
47 | 49 | putname(filename); |
48 | 50 |
arch/parisc/kernel/process.c
... | ... | @@ -348,17 +348,22 @@ |
348 | 348 | error = PTR_ERR(filename); |
349 | 349 | if (IS_ERR(filename)) |
350 | 350 | goto out; |
351 | - error = do_execve(filename, (char __user * __user *) regs->gr[25], | |
352 | - (char __user * __user *) regs->gr[24], regs); | |
351 | + error = do_execve(filename, | |
352 | + (const char __user *const __user *) regs->gr[25], | |
353 | + (const char __user *const __user *) regs->gr[24], | |
354 | + regs); | |
353 | 355 | putname(filename); |
354 | 356 | out: |
355 | 357 | |
356 | 358 | return error; |
357 | 359 | } |
358 | 360 | |
359 | -extern int __execve(const char *filename, char *const argv[], | |
360 | - char *const envp[], struct task_struct *task); | |
361 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
361 | +extern int __execve(const char *filename, | |
362 | + const char *const argv[], | |
363 | + const char *const envp[], struct task_struct *task); | |
364 | +int kernel_execve(const char *filename, | |
365 | + const char *const argv[], | |
366 | + const char *const envp[]) | |
362 | 367 | { |
363 | 368 | return __execve(filename, argv, envp, current); |
364 | 369 | } |
arch/powerpc/kernel/process.c
... | ... | @@ -1034,8 +1034,9 @@ |
1034 | 1034 | flush_fp_to_thread(current); |
1035 | 1035 | flush_altivec_to_thread(current); |
1036 | 1036 | flush_spe_to_thread(current); |
1037 | - error = do_execve(filename, (char __user * __user *) a1, | |
1038 | - (char __user * __user *) a2, regs); | |
1037 | + error = do_execve(filename, | |
1038 | + (const char __user *const __user *) a1, | |
1039 | + (const char __user *const __user *) a2, regs); | |
1039 | 1040 | putname(filename); |
1040 | 1041 | out: |
1041 | 1042 | return error; |
arch/s390/kernel/process.c
... | ... | @@ -267,8 +267,9 @@ |
267 | 267 | /* |
268 | 268 | * sys_execve() executes a new program. |
269 | 269 | */ |
270 | -SYSCALL_DEFINE3(execve, const char __user *, name, char __user * __user *, argv, | |
271 | - char __user * __user *, envp) | |
270 | +SYSCALL_DEFINE3(execve, const char __user *, name, | |
271 | + const char __user *const __user *, argv, | |
272 | + const char __user *const __user *, envp) | |
272 | 273 | { |
273 | 274 | struct pt_regs *regs = task_pt_regs(current); |
274 | 275 | char *filename; |
arch/score/kernel/sys_score.c
... | ... | @@ -99,8 +99,10 @@ |
99 | 99 | if (IS_ERR(filename)) |
100 | 100 | return error; |
101 | 101 | |
102 | - error = do_execve(filename, (char __user *__user*)regs->regs[5], | |
103 | - (char __user *__user *) regs->regs[6], regs); | |
102 | + error = do_execve(filename, | |
103 | + (const char __user *const __user *)regs->regs[5], | |
104 | + (const char __user *const __user *)regs->regs[6], | |
105 | + regs); | |
104 | 106 | |
105 | 107 | putname(filename); |
106 | 108 | return error; |
... | ... | @@ -110,7 +112,9 @@ |
110 | 112 | * Do a system call from kernel instead of calling sys_execve so we |
111 | 113 | * end up with proper pt_regs. |
112 | 114 | */ |
113 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
115 | +int kernel_execve(const char *filename, | |
116 | + const char *const argv[], | |
117 | + const char *const envp[]) | |
114 | 118 | { |
115 | 119 | register unsigned long __r4 asm("r4") = (unsigned long) filename; |
116 | 120 | register unsigned long __r5 asm("r5") = (unsigned long) argv; |
arch/sh/kernel/process_32.c
... | ... | @@ -296,9 +296,10 @@ |
296 | 296 | /* |
297 | 297 | * sys_execve() executes a new program. |
298 | 298 | */ |
299 | -asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv, | |
300 | - char __user * __user *uenvp, unsigned long r7, | |
301 | - struct pt_regs __regs) | |
299 | +asmlinkage int sys_execve(const char __user *ufilename, | |
300 | + const char __user *const __user *uargv, | |
301 | + const char __user *const __user *uenvp, | |
302 | + unsigned long r7, struct pt_regs __regs) | |
302 | 303 | { |
303 | 304 | struct pt_regs *regs = RELOC_HIDE(&__regs, 0); |
304 | 305 | int error; |
arch/sh/kernel/process_64.c
... | ... | @@ -497,8 +497,8 @@ |
497 | 497 | goto out; |
498 | 498 | |
499 | 499 | error = do_execve(filename, |
500 | - (char __user * __user *)uargv, | |
501 | - (char __user * __user *)uenvp, | |
500 | + (const char __user *const __user *)uargv, | |
501 | + (const char __user *const __user *)uenvp, | |
502 | 502 | pregs); |
503 | 503 | putname(filename); |
504 | 504 | out: |
arch/sh/kernel/sys_sh32.c
... | ... | @@ -71,7 +71,9 @@ |
71 | 71 | * Do a system call from kernel instead of calling sys_execve so we |
72 | 72 | * end up with proper pt_regs. |
73 | 73 | */ |
74 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
74 | +int kernel_execve(const char *filename, | |
75 | + const char *const argv[], | |
76 | + const char *const envp[]) | |
75 | 77 | { |
76 | 78 | register long __sc0 __asm__ ("r3") = __NR_execve; |
77 | 79 | register long __sc4 __asm__ ("r4") = (long) filename; |
arch/sh/kernel/sys_sh64.c
... | ... | @@ -33,7 +33,9 @@ |
33 | 33 | * Do a system call from kernel instead of calling sys_execve so we |
34 | 34 | * end up with proper pt_regs. |
35 | 35 | */ |
36 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
36 | +int kernel_execve(const char *filename, | |
37 | + const char *const argv[], | |
38 | + const char *const envp[]) | |
37 | 39 | { |
38 | 40 | register unsigned long __sc0 __asm__ ("r9") = ((0x13 << 16) | __NR_execve); |
39 | 41 | register unsigned long __sc2 __asm__ ("r2") = (unsigned long) filename; |
arch/sparc/kernel/process_32.c
... | ... | @@ -633,8 +633,10 @@ |
633 | 633 | if(IS_ERR(filename)) |
634 | 634 | goto out; |
635 | 635 | error = do_execve(filename, |
636 | - (char __user * __user *)regs->u_regs[base + UREG_I1], | |
637 | - (char __user * __user *)regs->u_regs[base + UREG_I2], | |
636 | + (const char __user *const __user *) | |
637 | + regs->u_regs[base + UREG_I1], | |
638 | + (const char __user *const __user *) | |
639 | + regs->u_regs[base + UREG_I2], | |
638 | 640 | regs); |
639 | 641 | putname(filename); |
640 | 642 | out: |
arch/sparc/kernel/process_64.c
... | ... | @@ -739,9 +739,9 @@ |
739 | 739 | if (IS_ERR(filename)) |
740 | 740 | goto out; |
741 | 741 | error = do_execve(filename, |
742 | - (char __user * __user *) | |
742 | + (const char __user *const __user *) | |
743 | 743 | regs->u_regs[base + UREG_I1], |
744 | - (char __user * __user *) | |
744 | + (const char __user *const __user *) | |
745 | 745 | regs->u_regs[base + UREG_I2], regs); |
746 | 746 | putname(filename); |
747 | 747 | if (!error) { |
arch/sparc/kernel/sys_sparc_32.c
... | ... | @@ -282,7 +282,9 @@ |
282 | 282 | * Do a system call from kernel instead of calling sys_execve so we |
283 | 283 | * end up with proper pt_regs. |
284 | 284 | */ |
285 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
285 | +int kernel_execve(const char *filename, | |
286 | + const char *const argv[], | |
287 | + const char *const envp[]) | |
286 | 288 | { |
287 | 289 | long __res; |
288 | 290 | register long __g1 __asm__ ("g1") = __NR_execve; |
arch/sparc/kernel/sys_sparc_64.c
... | ... | @@ -758,7 +758,9 @@ |
758 | 758 | * Do a system call from kernel instead of calling sys_execve so we |
759 | 759 | * end up with proper pt_regs. |
760 | 760 | */ |
761 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
761 | +int kernel_execve(const char *filename, | |
762 | + const char *const argv[], | |
763 | + const char *const envp[]) | |
762 | 764 | { |
763 | 765 | long __res; |
764 | 766 | register long __g1 __asm__ ("g1") = __NR_execve; |
arch/tile/kernel/process.c
... | ... | @@ -543,8 +543,9 @@ |
543 | 543 | /* |
544 | 544 | * sys_execve() executes a new program. |
545 | 545 | */ |
546 | -long _sys_execve(char __user *path, char __user *__user *argv, | |
547 | - char __user *__user *envp, struct pt_regs *regs) | |
546 | +long _sys_execve(const char __user *path, | |
547 | + const char __user *const __user *argv, | |
548 | + const char __user *const __user *envp, struct pt_regs *regs) | |
548 | 549 | { |
549 | 550 | long error; |
550 | 551 | char *filename; |
arch/um/kernel/exec.c
... | ... | @@ -44,8 +44,9 @@ |
44 | 44 | PT_REGS_SP(regs) = esp; |
45 | 45 | } |
46 | 46 | |
47 | -static long execve1(const char *file, char __user * __user *argv, | |
48 | - char __user *__user *env) | |
47 | +static long execve1(const char *file, | |
48 | + const char __user *const __user *argv, | |
49 | + const char __user *const __user *env) | |
49 | 50 | { |
50 | 51 | long error; |
51 | 52 |
arch/um/kernel/syscall.c
arch/x86/include/asm/syscalls.h
... | ... | @@ -23,8 +23,9 @@ |
23 | 23 | /* kernel/process.c */ |
24 | 24 | int sys_fork(struct pt_regs *); |
25 | 25 | int sys_vfork(struct pt_regs *); |
26 | -long sys_execve(const char __user *, char __user * __user *, | |
27 | - char __user * __user *, struct pt_regs *); | |
26 | +long sys_execve(const char __user *, | |
27 | + const char __user *const __user *, | |
28 | + const char __user *const __user *, struct pt_regs *); | |
28 | 29 | long sys_clone(unsigned long, unsigned long, void __user *, |
29 | 30 | void __user *, struct pt_regs *); |
30 | 31 |
arch/x86/kernel/process.c
... | ... | @@ -301,8 +301,9 @@ |
301 | 301 | /* |
302 | 302 | * sys_execve() executes a new program. |
303 | 303 | */ |
304 | -long sys_execve(const char __user *name, char __user * __user *argv, | |
305 | - char __user * __user *envp, struct pt_regs *regs) | |
304 | +long sys_execve(const char __user *name, | |
305 | + const char __user *const __user *argv, | |
306 | + const char __user *const __user *envp, struct pt_regs *regs) | |
306 | 307 | { |
307 | 308 | long error; |
308 | 309 | char *filename; |
arch/x86/kernel/sys_i386_32.c
... | ... | @@ -28,7 +28,9 @@ |
28 | 28 | * Do a system call from kernel instead of calling sys_execve so we |
29 | 29 | * end up with proper pt_regs. |
30 | 30 | */ |
31 | -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | |
31 | +int kernel_execve(const char *filename, | |
32 | + const char *const argv[], | |
33 | + const char *const envp[]) | |
32 | 34 | { |
33 | 35 | long __res; |
34 | 36 | asm volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" |
arch/xtensa/kernel/process.c
... | ... | @@ -318,8 +318,9 @@ |
318 | 318 | */ |
319 | 319 | |
320 | 320 | asmlinkage |
321 | -long xtensa_execve(const char __user *name, char __user * __user *argv, | |
322 | - char __user * __user *envp, | |
321 | +long xtensa_execve(const char __user *name, | |
322 | + const char __user *const __user *argv, | |
323 | + const char __user *const __user *envp, | |
323 | 324 | long a3, long a4, long a5, |
324 | 325 | struct pt_regs *regs) |
325 | 326 | { |
fs/binfmt_misc.c
fs/binfmt_script.c
fs/exec.c
... | ... | @@ -361,13 +361,13 @@ |
361 | 361 | /* |
362 | 362 | * count() counts the number of strings in array ARGV. |
363 | 363 | */ |
364 | -static int count(char __user * __user * argv, int max) | |
364 | +static int count(const char __user * const __user * argv, int max) | |
365 | 365 | { |
366 | 366 | int i = 0; |
367 | 367 | |
368 | 368 | if (argv != NULL) { |
369 | 369 | for (;;) { |
370 | - char __user * p; | |
370 | + const char __user * p; | |
371 | 371 | |
372 | 372 | if (get_user(p, argv)) |
373 | 373 | return -EFAULT; |
... | ... | @@ -387,7 +387,7 @@ |
387 | 387 | * processes's memory to the new process's stack. The call to get_user_pages() |
388 | 388 | * ensures the destination page is created and not swapped out. |
389 | 389 | */ |
390 | -static int copy_strings(int argc, char __user * __user * argv, | |
390 | +static int copy_strings(int argc, const char __user *const __user *argv, | |
391 | 391 | struct linux_binprm *bprm) |
392 | 392 | { |
393 | 393 | struct page *kmapped_page = NULL; |
... | ... | @@ -396,7 +396,7 @@ |
396 | 396 | int ret; |
397 | 397 | |
398 | 398 | while (argc-- > 0) { |
399 | - char __user *str; | |
399 | + const char __user *str; | |
400 | 400 | int len; |
401 | 401 | unsigned long pos; |
402 | 402 | |
403 | 403 | |
... | ... | @@ -470,12 +470,13 @@ |
470 | 470 | /* |
471 | 471 | * Like copy_strings, but get argv and its values from kernel memory. |
472 | 472 | */ |
473 | -int copy_strings_kernel(int argc,char ** argv, struct linux_binprm *bprm) | |
473 | +int copy_strings_kernel(int argc, const char *const *argv, | |
474 | + struct linux_binprm *bprm) | |
474 | 475 | { |
475 | 476 | int r; |
476 | 477 | mm_segment_t oldfs = get_fs(); |
477 | 478 | set_fs(KERNEL_DS); |
478 | - r = copy_strings(argc, (char __user * __user *)argv, bprm); | |
479 | + r = copy_strings(argc, (const char __user *const __user *)argv, bprm); | |
479 | 480 | set_fs(oldfs); |
480 | 481 | return r; |
481 | 482 | } |
... | ... | @@ -997,7 +998,7 @@ |
997 | 998 | void setup_new_exec(struct linux_binprm * bprm) |
998 | 999 | { |
999 | 1000 | int i, ch; |
1000 | - char * name; | |
1001 | + const char *name; | |
1001 | 1002 | char tcomm[sizeof(current->comm)]; |
1002 | 1003 | |
1003 | 1004 | arch_pick_mmap_layout(current->mm); |
... | ... | @@ -1316,9 +1317,9 @@ |
1316 | 1317 | /* |
1317 | 1318 | * sys_execve() executes a new program. |
1318 | 1319 | */ |
1319 | -int do_execve(char * filename, | |
1320 | - char __user *__user *argv, | |
1321 | - char __user *__user *envp, | |
1320 | +int do_execve(const char * filename, | |
1321 | + const char __user *const __user *argv, | |
1322 | + const char __user *const __user *envp, | |
1322 | 1323 | struct pt_regs * regs) |
1323 | 1324 | { |
1324 | 1325 | struct linux_binprm *bprm; |
include/linux/binfmts.h
... | ... | @@ -50,8 +50,8 @@ |
50 | 50 | int unsafe; /* how unsafe this exec is (mask of LSM_UNSAFE_*) */ |
51 | 51 | unsigned int per_clear; /* bits to clear in current->personality */ |
52 | 52 | int argc, envc; |
53 | - char * filename; /* Name of binary as seen by procps */ | |
54 | - char * interp; /* Name of the binary really executed. Most | |
53 | + const char * filename; /* Name of binary as seen by procps */ | |
54 | + const char * interp; /* Name of the binary really executed. Most | |
55 | 55 | of the time same as filename, but could be |
56 | 56 | different for binfmt_{misc,script} */ |
57 | 57 | unsigned interp_flags; |
... | ... | @@ -126,7 +126,8 @@ |
126 | 126 | unsigned long stack_top, |
127 | 127 | int executable_stack); |
128 | 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 | 131 | extern int prepare_bprm_creds(struct linux_binprm *bprm); |
131 | 132 | extern void install_exec_creds(struct linux_binprm *bprm); |
132 | 133 | extern void do_coredump(long signr, int exit_code, struct pt_regs *regs); |
include/linux/sched.h
... | ... | @@ -2109,7 +2109,9 @@ |
2109 | 2109 | extern int allow_signal(int); |
2110 | 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 | 2115 | extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); |
2114 | 2116 | struct task_struct *fork_idle(int); |
2115 | 2117 |
include/linux/syscalls.h
... | ... | @@ -820,7 +820,7 @@ |
820 | 820 | u64 mask, int fd, |
821 | 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 | 826 | asmlinkage long sys_perf_event_open( |
init/do_mounts_initrd.c
... | ... | @@ -24,10 +24,11 @@ |
24 | 24 | |
25 | 25 | __setup("noinitrd", no_initrd); |
26 | 26 | |
27 | -static int __init do_linuxrc(void * shell) | |
27 | +static int __init do_linuxrc(void *_shell) | |
28 | 28 | { |
29 | - static char *argv[] = { "linuxrc", NULL, }; | |
30 | - extern char * envp_init[]; | |
29 | + static const char *argv[] = { "linuxrc", NULL, }; | |
30 | + extern const char *envp_init[]; | |
31 | + const char *shell = _shell; | |
31 | 32 | |
32 | 33 | sys_close(old_fd);sys_close(root_fd); |
33 | 34 | sys_setsid(); |
init/main.c
... | ... | @@ -197,8 +197,8 @@ |
197 | 197 | |
198 | 198 | __setup("reset_devices", set_reset_devices); |
199 | 199 | |
200 | -static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, }; | |
201 | -char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, }; | |
200 | +static const char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, }; | |
201 | +const char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, }; | |
202 | 202 | static const char *panic_later, *panic_param; |
203 | 203 | |
204 | 204 | extern const struct obs_kernel_param __setup_start[], __setup_end[]; |
... | ... | @@ -809,7 +809,7 @@ |
809 | 809 | do_one_initcall(*fn); |
810 | 810 | } |
811 | 811 | |
812 | -static void run_init_process(char *init_filename) | |
812 | +static void run_init_process(const char *init_filename) | |
813 | 813 | { |
814 | 814 | argv_init[0] = init_filename; |
815 | 815 | kernel_execve(init_filename, argv_init, envp_init); |
kernel/kmod.c
... | ... | @@ -153,7 +153,9 @@ |
153 | 153 | goto fail; |
154 | 154 | } |
155 | 155 | |
156 | - retval = kernel_execve(sub_info->path, sub_info->argv, sub_info->envp); | |
156 | + retval = kernel_execve(sub_info->path, | |
157 | + (const char *const *)sub_info->argv, | |
158 | + (const char *const *)sub_info->envp); | |
157 | 159 | |
158 | 160 | /* Exec failed? */ |
159 | 161 | fail: |
security/commoncap.c