FreeBSD 6.2 fork/[sg]etpriority竞态条件的修正

发现

在线上系统运行过程中,quakelee 报告在使用renice -u www +20时系统会出现特征为 Kernel Trap 12 的崩溃。

诊断

经过调试发现,内核中的 getpriority/setpriority 的 PRIO_USER 需要访问进程的 p_ucred 指针指向的信任状数据,这个数据由进程结构的 proc mutex 保护。然而,某些情况下,p_ucred可能是NULL,从而导致空指针引用并引致 Kernel Trap 12,具体说来,在 fork() 的过程中,尽管所有操作均做了正确的上锁,但存在这样的情形,即,拿到 proc mtx 时 p_ucred 为 NULL,这种状态出现在进程刚刚被复制(PRS_NEW),但还没有完成复制的阶段。

修正

待撰写

 
/usr/local/www/dokuwiki/data/pages/hacking/f/fork_race.txt · 最后更改: 2008/04/15 09:23 由 delphij
 
除额外注明的地方外,本维基上的内容按下列许可协议发布:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki