提交 c2258bf4 创建 作者: rsc's avatar rsc

fork minibug

上级 4f06ae0d
...@@ -110,3 +110,27 @@ moves reads down after writes, but the language in ...@@ -110,3 +110,27 @@ moves reads down after writes, but the language in
the spec allows it. There is no telling whether future the spec allows it. There is no telling whether future
processors will need it. processors will need it.
---
The code in sys_fork needs to read np->pid before
setting np->state to RUNNABLE.
int
sys_fork(void)
{
int pid;
struct proc *np;
if((np = copyproc(cp)) == 0)
return -1;
pid = np->pid;
np->state = RUNNABLE;
return pid;
}
After setting np->state to RUNNABLE, some other CPU
might run the process, it might exit, and then it might
get reused for a different process (with a new pid), all
before the return statement. So it's not safe to just do
"return np->pid;".
...@@ -7,12 +7,14 @@ ...@@ -7,12 +7,14 @@
int int
sys_fork(void) sys_fork(void)
{ {
int pid;
struct proc *np; struct proc *np;
if((np = copyproc(cp)) == 0) if((np = copyproc(cp)) == 0)
return -1; return -1;
pid = np->pid;
np->state = RUNNABLE; np->state = RUNNABLE;
return np->pid; return pid;
} }
int int
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论