xv6

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit b3bebfce8a790975ba941d346e6bcff1b5afecf9
parent fd8e3681010b2beea2f409038b5936831c9c8d50
Author: Russ Cox <rsc@swtch.com>
Date:   Mon, 13 Jul 2009 09:34:45 -0700

exec tweaks

Diffstat:
Mexec.c | 17+++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/exec.c b/exec.c @@ -16,19 +16,21 @@ exec(char *path, char **argv) struct inode *ip; struct proghdr ph; + mem = 0; + sz = 0; + if((ip = namei(path)) == 0) return -1; ilock(ip); - // Compute memory size of new process. - mem = 0; - sz = 0; - - // Program segments. + // Check ELF header if(readi(ip, (char*)&elf, 0, sizeof(elf)) < sizeof(elf)) goto bad; if(elf.magic != ELF_MAGIC) goto bad; + + // Compute memory size of new process. + // Program segments. for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ if(readi(ip, (char*)&ph, off, sizeof(ph)) != sizeof(ph)) goto bad; @@ -44,7 +46,10 @@ exec(char *path, char **argv) for(argc=0; argv[argc]; argc++) arglen += strlen(argv[argc]) + 1; arglen = (arglen+3) & ~3; - sz += arglen + 4*(argc+1); + sz += arglen; + sz += 4*(argc+1); // argv data + sz += 4; // argv + sz += 4; // argc // Stack. sz += PAGE;