From c4cc10da7ef6d65f0f654445e0af35b8309f16c2 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Fri, 6 Aug 2010 11:12:18 -0400 Subject: fix corner cases in exec of ELF put an invalid page below the stack have fork() handle invalid pages --- exec.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'exec.c') diff --git a/exec.c b/exec.c index 8a92e99..4f11695 100644 --- a/exec.c +++ b/exec.c @@ -43,13 +43,16 @@ exec(char *path, char **argv) goto bad; if (!allocuvm(pgdir, (char *)ph.va, ph.memsz)) goto bad; - sz += PGROUNDUP(ph.memsz); + if(ph.va + ph.memsz > sz) + sz = ph.va + ph.memsz; if (!loaduvm(pgdir, (char *)ph.va, ip, ph.offset, ph.filesz)) goto bad; } iunlockput(ip); // Allocate and initialize stack at sz + sz = PGROUNDUP(sz); + sz += PGSIZE; // leave an invalid page if (!allocuvm(pgdir, (char *)sz, PGSIZE)) goto bad; mem = uva2ka(pgdir, (char *)sz); @@ -95,7 +98,7 @@ exec(char *path, char **argv) proc->tf->eip = elf.entry; // main proc->tf->esp = sp; - loadvm(proc); + switchuvm(proc); freevm(oldpgdir); -- cgit v1.2.3