diff --git a/sh.c b/sh.c index 16e325b..3ac6f5b 100644 --- a/sh.c +++ b/sh.c @@ -147,7 +147,7 @@ main(void) static char buf[100]; int fd; - // Assumes three file descriptors open. + // Ensure that three file descriptors are open. while((fd = open("console", O_RDWR)) >= 0){ if(fd >= 3){ close(fd); @@ -158,8 +158,7 @@ main(void) // Read and run input commands. while(getcmd(buf, sizeof(buf)) >= 0){ if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){ - // Clumsy but will have to do for now. - // Chdir has no effect on the parent if run in the child. + // Chdir must be called by the parent, not the child. buf[strlen(buf)-1] = 0; // chop \n if(chdir(buf+3) < 0) printf(2, "cannot cd %s\n", buf+3); diff --git a/vm.c b/vm.c index 5326d14..85f6ce2 100644 --- a/vm.c +++ b/vm.c @@ -237,7 +237,12 @@ allocuvm(pde_t *pgdir, uint oldsz, uint newsz) return 0; } memset(mem, 0, PGSIZE); - mappages(pgdir, (char*)a, PGSIZE, v2p(mem), PTE_W|PTE_U); + if(mappages(pgdir, (char*)a, PGSIZE, v2p(mem), PTE_W|PTE_U) < 0){ + cprintf("allocuvm out of memory (2)\n"); + deallocuvm(pgdir, newsz, oldsz); + kfree(mem); + return 0; + } } return newsz; }