diff options
author | Robert Morris <rtm@csail.mit.edu> | 2020-08-13 14:10:58 -0400 |
---|---|---|
committer | Frans Kaashoek <kaashoek@mit.edu> | 2020-08-17 08:18:23 -0400 |
commit | f2ec6777bd530f949c235d7f0386286314a2f601 (patch) | |
tree | cbe357dd9ef3df772c2bc0446b666ef10425ab7c /kernel/exec.c | |
parent | 8dc71a257d80d1e2f56cd7f931ca389fbb727b5c (diff) | |
download | xv6-labs-f2ec6777bd530f949c235d7f0386286314a2f601.tar.gz xv6-labs-f2ec6777bd530f949c235d7f0386286314a2f601.tar.bz2 xv6-labs-f2ec6777bd530f949c235d7f0386286314a2f601.zip |
fix a bug in the out-of-memory handling code in exec
Diffstat (limited to 'kernel/exec.c')
-rw-r--r-- | kernel/exec.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/kernel/exec.c b/kernel/exec.c index 1077ac0..8a2d1dc 100644 --- a/kernel/exec.c +++ b/kernel/exec.c @@ -14,7 +14,7 @@ exec(char *path, char **argv) { char *s, *last; int i, off; - uint64 argc, sz, sp, ustack[MAXARG+1], stackbase; + uint64 argc, sz = 0, sp, ustack[MAXARG+1], stackbase; struct elfhdr elf; struct inode *ip; struct proghdr ph; @@ -39,7 +39,6 @@ exec(char *path, char **argv) goto bad; // Load program into memory. - sz = 0; for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph)) goto bad; @@ -49,8 +48,10 @@ exec(char *path, char **argv) goto bad; if(ph.vaddr + ph.memsz < ph.vaddr) goto bad; - if((sz = uvmalloc(pagetable, sz, ph.vaddr + ph.memsz)) == 0) + uint64 sz1; + if((sz1 = uvmalloc(pagetable, sz, ph.vaddr + ph.memsz)) == 0) goto bad; + sz = sz1; if(ph.vaddr % PGSIZE != 0) goto bad; if(loadseg(pagetable, ph.vaddr, ip, ph.off, ph.filesz) < 0) |