diff options
-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; |