From b78894f34ebbceb23bcf36ff820fefb942b54ccf Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Tue, 4 Jun 2019 06:51:01 -0400 Subject: [PATCH] check that arguments aren't more than a page in exec() --- exec.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/exec.c b/exec.c index c854aae..63b5b62 100644 --- a/exec.c +++ b/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;