summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_descrip.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2008-12-30 12:51:56 +0000
committerkib <kib@FreeBSD.org>2008-12-30 12:51:56 +0000
commit2349a65923842226ae7c1ed630f1d87991af065f (patch)
tree7135e4581cdd1907c670846ab78199621dd7bc4e /sys/kern/kern_descrip.c
parentc81ec4dc0cecf45dc086334679db54d433ea478d (diff)
downloadFreeBSD-src-2349a65923842226ae7c1ed630f1d87991af065f.zip
FreeBSD-src-2349a65923842226ae7c1ed630f1d87991af065f.tar.gz
Clear the pointers to the file in the struct filedesc before file is closed
in fdfree. Otherwise, sysctl_kern_proc_filedesc may dereference stale struct file * values. Reported and tested by: pho MFC after: 1 month
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r--sys/kern/kern_descrip.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index c981411..648d27e 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -1703,14 +1703,16 @@ fdfree(struct thread *td)
FILEDESC_XUNLOCK(fdp);
if (i > 0)
return;
- /*
- * We are the last reference to the structure, so we can
- * safely assume it will not change out from under us.
- */
+
fpp = fdp->fd_ofiles;
for (i = fdp->fd_lastfile; i-- >= 0; fpp++) {
- if (*fpp)
- (void) closef(*fpp, td);
+ if (*fpp) {
+ FILEDESC_XLOCK(fdp);
+ fp = *fpp;
+ *fpp = NULL;
+ FILEDESC_XUNLOCK(fdp);
+ (void) closef(fp, td);
+ }
}
FILEDESC_XLOCK(fdp);
OpenPOWER on IntegriCloud