summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2020-08-13 14:10:58 -0400
committerFrans Kaashoek <[email protected]>2020-08-17 08:18:23 -0400
commitf2ec6777bd530f949c235d7f0386286314a2f601 (patch)
treecbe357dd9ef3df772c2bc0446b666ef10425ab7c
parent8dc71a257d80d1e2f56cd7f931ca389fbb727b5c (diff)
downloadxv6-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
-rw-r--r--kernel/exec.c7
-rw-r--r--kernel/vm.c3
2 files changed, 5 insertions, 5 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)
diff --git a/kernel/vm.c b/kernel/vm.c
index 2f3789f..bccb405 100644
--- a/kernel/vm.c
+++ b/kernel/vm.c
@@ -235,8 +235,7 @@ uvmalloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
return oldsz;
oldsz = PGROUNDUP(oldsz);
- a = oldsz;
- for(; a < newsz; a += PGSIZE){
+ for(a = oldsz; a < newsz; a += PGSIZE){
mem = kalloc();
if(mem == 0){
uvmdealloc(pagetable, a, oldsz);