I found a race condition in kern_descrip.c, the race is in function falloc(),
it opens a race window at line 1147:
FILEDESC_UNLOCK(p->p_fd);
sx_xlock(&filelist_lock);
FILEDESC_LOCK(p->p_fd);
fix:
--- kern_descrip.c Tue Jul 16 12:29:44 2002
+++ kern_descrip.c.new Tue Jul 16 12:26:50 2002
@@ -1107,6 +1107,7 @@
register struct file *fp, *fq;
int error, i;
+retry:
sx_xlock(&filelist_lock);
if (nfiles >= maxfiles) {
sx_xunlock(&filelist_lock);
@@ -1151,6 +1152,13 @@
LIST_INSERT_AFTER(fq, fp, f_list);
} else {
LIST_INSERT_HEAD(&filehead, fp, f_list);
+ }
+ if (p->p_fd->fd_ofiles[i] != NULL) {
+ fp->f_count = 0;
+ FILEDESC_UNLOCK(p->p_fd);
+ sx_xunlock(&filelist_lock);
+ ffree(fp);
+ goto retry;
}
p->p_fd->fd_ofiles[i] = fp;
FILEDESC_UNLOCK(p->p_fd);
---
David Xu
I칻&ޱݙݢjH:+칻&~n\ޞاܨ~^,j