Date: Sat, 14 Sep 2002 02:50:13 -0700 (PDT) From: Nate Lawson <nate@root.org> To: current@freebsd.org Subject: patch for lock recursion in execve() Message-ID: <Pine.BSF.4.21.0209140245510.28837-100000@root.org>
next in thread | raw e-mail | index | archive | help
In short: execve has proc lock, calls setugidsafety. If a fd 0...2
references procfs, it is closed via closef(), ... pfs_close(), pfind(),
dopfind() which tries to lock allprocs and then proc
lock. setugidsafety() should drop proc lock or be moved down a few lines
along with fdcheckstd() to be outside of proc lock.
My only concern is if this opens up a race window where fds 0...2 could be
reopened to point to procfs. I'm fairly certain this is not possible but
would like some assurance before committing this.
-Nate
Index: kern_exec.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_exec.c,v
retrieving revision 1.190
diff -u -r1.190 kern_exec.c
--- kern_exec.c 13 Sep 2002 09:31:56 -0000 1.190
+++ kern_exec.c 14 Sep 2002 09:39:41 -0000
@@ -435,15 +435,17 @@
mtx_unlock(&ktrace_mtx);
}
#endif
- /* Close any file descriptors 0..2 that reference procfs
*/
- setugidsafety(td);
/*
- * Make sure file descriptors 0..2 are in use.
+ * Close any file descriptors 0..2 that reference procfs,
+ * then make sure file descriptors 0..2 are in use.
*
+ * setugidsafety() may call closef() and then pfind()
+ * which may grab the process lock and
* fdcheckstd() may call falloc() which may block to
* allocate memory, so temporarily drop the process lock.
*/
PROC_UNLOCK(p);
+ setugidsafety(td);
error = fdcheckstd(td);
PROC_LOCK(p);
if (error != 0)
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0209140245510.28837-100000>
