Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Jul 2002 13:21:20 +0800
From:      David Xu <davidx@viasoft.com.cn>
To:        "freebsd-current@freebsd.org" <freebsd-current@freebsd.org>
Subject:   race condition in kern_descrip.c and fix
Message-ID:  <200207160547.NAA08469@mail.viasoft.com.cn>

next in thread | raw e-mail | index | archive | help

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


Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200207160547.NAA08469>