summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <[email protected]>2009-07-13 09:34:45 -0700
committerRuss Cox <[email protected]>2009-07-13 09:34:45 -0700
commitb3bebfce8a790975ba941d346e6bcff1b5afecf9 (patch)
tree4dad71a2728f6b2c44ff571c97cb0c512470d6a4
parentfd8e3681010b2beea2f409038b5936831c9c8d50 (diff)
downloadxv6-labs-b3bebfce8a790975ba941d346e6bcff1b5afecf9.tar.gz
xv6-labs-b3bebfce8a790975ba941d346e6bcff1b5afecf9.tar.bz2
xv6-labs-b3bebfce8a790975ba941d346e6bcff1b5afecf9.zip
exec tweaks
-rw-r--r--exec.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/exec.c b/exec.c
index 1c653de..3be3eed 100644
--- 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;