提交 06feabec 创建 作者: Robert Morris's avatar Robert Morris

check exec() arg length

fix double iunlockput
上级 4655d42e
...@@ -44,6 +44,7 @@ exec(char *path, char **argv) ...@@ -44,6 +44,7 @@ exec(char *path, char **argv)
goto bad; goto bad;
} }
iunlockput(ip); iunlockput(ip);
ip = 0;
// Allocate a one-page stack at the next page boundary // Allocate a one-page stack at the next page boundary
sz = PGROUNDUP(sz); sz = PGROUNDUP(sz);
...@@ -105,6 +106,9 @@ exec(char *path, char **argv) ...@@ -105,6 +106,9 @@ exec(char *path, char **argv)
uint ffffffff = 0xffffffff; uint ffffffff = 0xffffffff;
copyout(pgdir, sp, &ffffffff, 4); copyout(pgdir, sp, &ffffffff, 4);
if(sp < sz - PGSIZE)
goto bad;
// Save program name for debugging. // Save program name for debugging.
for(last=s=path; *s; s++) for(last=s=path; *s; s++)
if(*s == '/') if(*s == '/')
...@@ -125,8 +129,9 @@ exec(char *path, char **argv) ...@@ -125,8 +129,9 @@ exec(char *path, char **argv)
return 0; return 0;
bad: bad:
cprintf("kernel: exec failed\n"); if(pgdir)
if(pgdir) freevm(pgdir); freevm(pgdir);
iunlockput(ip); if(ip)
iunlockput(ip);
return -1; return -1;
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论