check that arguments aren't more than a page in exec()
This commit is contained in:
parent
0f684b9150
commit
b78894f34e
7
exec.c
7
exec.c
|
@ -13,7 +13,7 @@ exec(char *path, char **argv)
|
|||
{
|
||||
char *s, *last;
|
||||
int i, off;
|
||||
uint64 argc, sz, sp, ustack[MAXARG+1];
|
||||
uint64 argc, sz, sp, ustack[MAXARG+1], stackbase;
|
||||
struct elfhdr elf;
|
||||
struct inode *ip;
|
||||
struct proghdr ph;
|
||||
|
@ -66,6 +66,7 @@ exec(char *path, char **argv)
|
|||
if((sz = uvmalloc(pagetable, sz, sz + 2*PGSIZE)) == 0)
|
||||
goto bad;
|
||||
sp = sz;
|
||||
stackbase = sp - PGSIZE;
|
||||
|
||||
// Push argument strings, prepare rest of stack in ustack.
|
||||
for(argc = 0; argv[argc]; argc++) {
|
||||
|
@ -73,6 +74,8 @@ exec(char *path, char **argv)
|
|||
goto bad;
|
||||
sp -= strlen(argv[argc]) + 1;
|
||||
sp -= sp % 16; // riscv sp must be 16-byte aligned
|
||||
if(sp < stackbase)
|
||||
goto bad;
|
||||
if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0)
|
||||
goto bad;
|
||||
ustack[argc] = sp;
|
||||
|
@ -82,6 +85,8 @@ exec(char *path, char **argv)
|
|||
// push the array of argv[] pointers.
|
||||
sp -= (argc+1) * sizeof(uint64);
|
||||
sp -= sp % 16;
|
||||
if(sp < stackbase)
|
||||
goto bad;
|
||||
if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0)
|
||||
goto bad;
|
||||
|
||||
|
|
Loading…
Reference in a new issue