fix a bug in the out-of-memory handling code in exec

This commit is contained in:
Robert Morris 2020-08-13 14:10:58 -04:00 committed by Frans Kaashoek
parent 8dc71a257d
commit f2ec6777bd
2 changed files with 5 additions and 5 deletions

View file

@ -14,7 +14,7 @@ exec(char *path, char **argv)
{ {
char *s, *last; char *s, *last;
int i, off; int i, off;
uint64 argc, sz, sp, ustack[MAXARG+1], stackbase; uint64 argc, sz = 0, sp, ustack[MAXARG+1], stackbase;
struct elfhdr elf; struct elfhdr elf;
struct inode *ip; struct inode *ip;
struct proghdr ph; struct proghdr ph;
@ -39,7 +39,6 @@ exec(char *path, char **argv)
goto bad; goto bad;
// Load program into memory. // Load program into memory.
sz = 0;
for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph)) if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph))
goto bad; goto bad;
@ -49,8 +48,10 @@ exec(char *path, char **argv)
goto bad; goto bad;
if(ph.vaddr + ph.memsz < ph.vaddr) if(ph.vaddr + ph.memsz < ph.vaddr)
goto bad; 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; goto bad;
sz = sz1;
if(ph.vaddr % PGSIZE != 0) if(ph.vaddr % PGSIZE != 0)
goto bad; goto bad;
if(loadseg(pagetable, ph.vaddr, ip, ph.off, ph.filesz) < 0) if(loadseg(pagetable, ph.vaddr, ip, ph.off, ph.filesz) < 0)

View file

@ -235,8 +235,7 @@ uvmalloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
return oldsz; return oldsz;
oldsz = PGROUNDUP(oldsz); oldsz = PGROUNDUP(oldsz);
a = oldsz; for(a = oldsz; a < newsz; a += PGSIZE){
for(; a < newsz; a += PGSIZE){
mem = kalloc(); mem = kalloc();
if(mem == 0){ if(mem == 0){
uvmdealloc(pagetable, a, oldsz); uvmdealloc(pagetable, a, oldsz);