diff options
author | Russ Cox <[email protected]> | 2009-07-13 09:34:45 -0700 |
---|---|---|
committer | Russ Cox <[email protected]> | 2009-07-13 09:34:45 -0700 |
commit | b3bebfce8a790975ba941d346e6bcff1b5afecf9 (patch) | |
tree | 4dad71a2728f6b2c44ff571c97cb0c512470d6a4 | |
parent | fd8e3681010b2beea2f409038b5936831c9c8d50 (diff) | |
download | xv6-labs-b3bebfce8a790975ba941d346e6bcff1b5afecf9.tar.gz xv6-labs-b3bebfce8a790975ba941d346e6bcff1b5afecf9.tar.bz2 xv6-labs-b3bebfce8a790975ba941d346e6bcff1b5afecf9.zip |
exec tweaks
-rw-r--r-- | exec.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -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; |