Skip to content

Commit d762746

Browse files
dhowellstorvalds
authored andcommitted
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 <[email protected]> Tested-by: Ralf Baechle <[email protected]> Acked-by: Russell King <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent da5cabf commit d762746

File tree

50 files changed

+179
-98
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+179
-98
lines changed

arch/alpha/kernel/process.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,9 @@ EXPORT_SYMBOL(dump_elf_task_fp);
387387
* sys_execve() executes a new program.
388388
*/
389389
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)
392393
{
393394
int error;
394395
char *filename;

arch/arm/kernel/sys_arm.c

+9-5
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ asmlinkage int sys_vfork(struct pt_regs *regs)
6262
/* sys_execve() executes a new program.
6363
* This is called indirectly via a small wrapper
6464
*/
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)
6768
{
6869
int error;
6970
char * filename;
@@ -78,14 +79,17 @@ asmlinkage int sys_execve(const char __user *filenamei, char __user * __user *ar
7879
return error;
7980
}
8081

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[])
8285
{
8386
struct pt_regs regs;
8487
int ret;
8588

8689
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);
8993
if (ret < 0)
9094
goto out;
9195

arch/avr32/kernel/process.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,9 @@ asmlinkage int sys_vfork(struct pt_regs *regs)
384384
}
385385

386386
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)
389390
{
390391
int error;
391392
char *filename;

arch/avr32/kernel/sys_avr32.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
*/
88
#include <linux/unistd.h>
99

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)
1113
{
1214
register long scno asm("r8") = __NR_execve;
1315
register long sc1 asm("r12") = (long)file;

arch/blackfin/kernel/process.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,9 @@ copy_thread(unsigned long clone_flags,
209209
/*
210210
* sys_execve() executes a new program.
211211
*/
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)
213215
{
214216
int error;
215217
char *filename;

arch/cris/arch-v10/kernel/process.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,9 @@ asmlinkage int sys_vfork(long r10, long r11, long r12, long r13, long mof, long
204204
/*
205205
* sys_execve() executes a new program.
206206
*/
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,
208210
long r13, long mof, long srp,
209211
struct pt_regs *regs)
210212
{

arch/cris/arch-v32/kernel/process.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,10 @@ sys_vfork(long r10, long r11, long r12, long r13, long mof, long srp,
218218

219219
/* sys_execve() executes a new program. */
220220
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)
223225
{
224226
int error;
225227
char *filename;

arch/frv/kernel/process.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,9 @@ int copy_thread(unsigned long clone_flags,
250250
/*
251251
* sys_execve() executes a new program.
252252
*/
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)
255256
{
256257
int error;
257258
char * filename;

arch/h8300/kernel/process.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,10 @@ int copy_thread(unsigned long clone_flags,
212212
/*
213213
* sys_execve() executes a new program.
214214
*/
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, ...)
216219
{
217220
int error;
218221
char * filename;

arch/h8300/kernel/sys_h8300.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ asmlinkage void syscall_print(void *dummy,...)
5151
* Do a system call from kernel instead of calling sys_execve so we
5252
* end up with proper pt_regs.
5353
*/
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[])
5557
{
5658
register long res __asm__("er0");
5759
register char *const *_c __asm__("er3") = envp;

arch/ia64/kernel/process.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,9 @@ dump_fpu (struct pt_regs *pt, elf_fpregset_t dst)
633633
}
634634

635635
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,
637639
struct pt_regs *regs)
638640
{
639641
char *fname;

arch/m32r/kernel/process.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,8 @@ asmlinkage int sys_vfork(unsigned long r0, unsigned long r1, unsigned long r2,
289289
* sys_execve() executes a new program.
290290
*/
291291
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,
294294
unsigned long r3, unsigned long r4, unsigned long r5,
295295
unsigned long r6, struct pt_regs regs)
296296
{

arch/m32r/kernel/sys_m32r.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,9 @@ asmlinkage int sys_cachectl(char *addr, int nbytes, int op)
9393
* Do a system call from kernel instead of calling sys_execve so we
9494
* end up with proper pt_regs.
9595
*/
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[])
9799
{
98100
register long __scno __asm__ ("r7") = __NR_execve;
99101
register long __arg3 __asm__ ("r2") = (long)(envp);

arch/m68k/kernel/process.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,9 @@ EXPORT_SYMBOL(dump_fpu);
315315
/*
316316
* sys_execve() executes a new program.
317317
*/
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)
319321
{
320322
int error;
321323
char * filename;

arch/m68k/kernel/sys_m68k.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,9 @@ asmlinkage int sys_getpagesize(void)
459459
* Do a system call from kernel instead of calling sys_execve so we
460460
* end up with proper pt_regs.
461461
*/
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[])
463465
{
464466
register long __res asm ("%d0") = __NR_execve;
465467
register long __a asm ("%d1") = (long)(filename);

arch/m68knommu/kernel/process.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,9 @@ void dump(struct pt_regs *fp)
350350
/*
351351
* sys_execve() executes a new program.
352352
*/
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)
354356
{
355357
int error;
356358
char * filename;

arch/m68knommu/kernel/sys_m68k.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ asmlinkage int sys_getpagesize(void)
4444
* Do a system call from kernel instead of calling sys_execve so we
4545
* end up with proper pt_regs.
4646
*/
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[])
4850
{
4951
register long __res asm ("%d0") = __NR_execve;
5052
register long __a asm ("%d1") = (long)(filename);

arch/microblaze/kernel/sys_microblaze.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@ asmlinkage long microblaze_clone(int flags, unsigned long stack, struct pt_regs
4747
return do_fork(flags, stack, regs, 0, NULL, NULL);
4848
}
4949

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)
5254
{
5355
int error;
5456
char *filename;
@@ -77,7 +79,9 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
7779
* Do a system call from kernel instead of calling sys_execve so we
7880
* end up with proper pt_regs.
7981
*/
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[])
8185
{
8286
register const char *__a __asm__("r5") = filename;
8387
register const void *__b __asm__("r6") = argv;

arch/mips/kernel/syscall.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,10 @@ asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs)
258258
error = PTR_ERR(filename);
259259
if (IS_ERR(filename))
260260
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);
263265
putname(filename);
264266

265267
out:
@@ -436,7 +438,9 @@ asmlinkage void bad_stack(void)
436438
* Do a system call from kernel instead of calling sys_execve so we
437439
* end up with proper pt_regs.
438440
*/
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[])
440444
{
441445
register unsigned long __a0 asm("$4") = (unsigned long) filename;
442446
register unsigned long __a1 asm("$5") = (unsigned long) argv;

arch/mn10300/kernel/process.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ asmlinkage long sys_vfork(void)
269269
}
270270

271271
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)
274274
{
275275
char *filename;
276276
int error;

arch/parisc/hpux/fs.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ int hpux_execve(struct pt_regs *regs)
4141
if (IS_ERR(filename))
4242
goto out;
4343

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);
4648

4749
putname(filename);
4850

arch/parisc/kernel/process.c

+10-5
Original file line numberDiff line numberDiff line change
@@ -348,17 +348,22 @@ asmlinkage int sys_execve(struct pt_regs *regs)
348348
error = PTR_ERR(filename);
349349
if (IS_ERR(filename))
350350
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);
353355
putname(filename);
354356
out:
355357

356358
return error;
357359
}
358360

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[])
362367
{
363368
return __execve(filename, argv, envp, current);
364369
}

arch/powerpc/kernel/process.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -1034,8 +1034,9 @@ int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
10341034
flush_fp_to_thread(current);
10351035
flush_altivec_to_thread(current);
10361036
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);
10391040
putname(filename);
10401041
out:
10411042
return error;

arch/s390/kernel/process.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,9 @@ asmlinkage void execve_tail(void)
267267
/*
268268
* sys_execve() executes a new program.
269269
*/
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)
272273
{
273274
struct pt_regs *regs = task_pt_regs(current);
274275
char *filename;

arch/score/kernel/sys_score.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,10 @@ score_execve(struct pt_regs *regs)
9999
if (IS_ERR(filename))
100100
return error;
101101

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);
104106

105107
putname(filename);
106108
return error;
@@ -110,7 +112,9 @@ score_execve(struct pt_regs *regs)
110112
* Do a system call from kernel instead of calling sys_execve so we
111113
* end up with proper pt_regs.
112114
*/
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[])
114118
{
115119
register unsigned long __r4 asm("r4") = (unsigned long) filename;
116120
register unsigned long __r5 asm("r5") = (unsigned long) argv;

arch/sh/kernel/process_32.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -296,9 +296,10 @@ asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,
296296
/*
297297
* sys_execve() executes a new program.
298298
*/
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)
302303
{
303304
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
304305
int error;

arch/sh/kernel/process_64.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -497,8 +497,8 @@ asmlinkage int sys_execve(const char *ufilename, char **uargv,
497497
goto out;
498498

499499
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,
502502
pregs);
503503
putname(filename);
504504
out:

arch/sh/kernel/sys_sh32.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ asmlinkage int sys_fadvise64_64_wrapper(int fd, u32 offset0, u32 offset1,
7171
* Do a system call from kernel instead of calling sys_execve so we
7272
* end up with proper pt_regs.
7373
*/
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[])
7577
{
7678
register long __sc0 __asm__ ("r3") = __NR_execve;
7779
register long __sc4 __asm__ ("r4") = (long) filename;

0 commit comments

Comments
 (0)