Module Name:    src
Committed By:   chs
Date:           Sun Sep 25 13:40:37 UTC 2011

Modified Files:
        src/sys/kern: kern_descrip.c

Log Message:
in fd_allocfile(), free the fd if we fail to allocate a file.


To generate a diff of this commit:
cvs rdiff -u -r1.216 -r1.217 src/sys/kern/kern_descrip.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_descrip.c
diff -u src/sys/kern/kern_descrip.c:1.216 src/sys/kern/kern_descrip.c:1.217
--- src/sys/kern/kern_descrip.c:1.216	Fri Jul 15 14:50:19 2011
+++ src/sys/kern/kern_descrip.c	Sun Sep 25 13:40:37 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_descrip.c,v 1.216 2011/07/15 14:50:19 christos Exp $	*/
+/*	$NetBSD: kern_descrip.c,v 1.217 2011/09/25 13:40:37 chs Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.216 2011/07/15 14:50:19 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.217 2011/09/25 13:40:37 chs Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -291,7 +291,7 @@ fd_used(filedesc_t *fdp, unsigned fd)
 	KASSERT(ff->ff_file == NULL);
 	KASSERT(!ff->ff_allocated);
 
-	ff->ff_allocated = 1;
+	ff->ff_allocated = true;
 	fdp->fd_lomap[off] |= 1 << (fd & NDENTRYMASK);
 	if (__predict_false(fdp->fd_lomap[off] == ~0)) {
 		KASSERT((fdp->fd_himap[off >> NDENTRYSHIFT] &
@@ -337,7 +337,7 @@ fd_unused(filedesc_t *fdp, unsigned fd)
 	}
 	KASSERT((fdp->fd_lomap[off] & (1 << (fd & NDENTRYMASK))) != 0);
 	fdp->fd_lomap[off] &= ~(1 << (fd & NDENTRYMASK));
-	ff->ff_allocated = 0;
+	ff->ff_allocated = false;
 
 	KASSERT(fd <= fdp->fd_lastfile);
 	if (fd == fdp->fd_lastfile) {
@@ -1083,6 +1083,7 @@ fd_allocfile(file_t **resultfp, int *res
 
 	fp = pool_cache_get(file_cache, PR_WAITOK);
 	if (fp == NULL) {
+		fd_abort(p, NULL, *resultfd);
 		return ENFILE;
 	}
 	KASSERT(fp->f_count == 0);

Reply via email to