====== FreeBSD 6.2 fork/[sg]etpriority竞态条件的修正 ====== ===== 发现 ===== 在线上系统运行过程中,[[user: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),但还没有完成复制的阶段。 ===== 修正 ===== // 待撰写