Commit d7627467b7a8dd6944885290a03a07ceb28c10eb

Authored by David Howells
Committed by Linus Torvalds
1 parent da5cabf80e

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
... ... @@ -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(&regs, 0, sizeof(struct pt_regs));
87   - ret = do_execve(filename, (char __user * __user *)argv,
88   - (char __user * __user *)envp, &regs);
  90 + ret = do_execve(filename,
  91 + (const char __user *const __user *)argv,
  92 + (const char __user *const __user *)envp, &regs);
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], &regs);
  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 + &regs);
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
... ... @@ -51,7 +51,9 @@
51 51 return err;
52 52 }
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 mm_segment_t fs;
57 59 int ret;
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 {
... ... @@ -108,7 +108,7 @@
108 108 Node *fmt;
109 109 struct file * interp_file = NULL;
110 110 char iname[BINPRM_BUF_SIZE];
111   - char *iname_addr = iname;
  111 + const char *iname_addr = iname;
112 112 int retval;
113 113 int fd_binary = -1;
114 114  
... ... @@ -16,7 +16,8 @@
16 16  
17 17 static int load_script(struct linux_binprm *bprm,struct pt_regs *regs)
18 18 {
19   - char *cp, *i_name, *i_arg;
  19 + const char *i_arg, *i_name;
  20 + char *cp;
20 21 struct file *file;
21 22 char interp[BINPRM_BUF_SIZE];
22 23 int retval;
... ... @@ -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();
... ... @@ -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);
... ... @@ -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
... ... @@ -40,7 +40,7 @@
40 40 *
41 41 * Warn if that happens, once per boot.
42 42 */
43   -static void warn_setuid_and_fcaps_mixed(char *fname)
  43 +static void warn_setuid_and_fcaps_mixed(const char *fname)
44 44 {
45 45 static int warned;
46 46 if (!warned) {