PERFORCE change 163694 for review

Robert Watson rwatson at FreeBSD.org
Sun Jun 7 09:43:57 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=163694

Change 163694 by rwatson at rwatson_freebsd_capabilities on 2009/06/07 09:43:20

	Fix reference management for capability vs. underlying file
	descriptor, required in the new world order of lock-free file
	descriptor reference acquisition.
	
	Fix the non-CAPABILITIES case to return VM_PROT_ALL for the maxprot
	mask, or mprotect(2) will fail in the runtime linker.

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/sys/kern/kern_descrip.c#24 edit
.. //depot/projects/trustedbsd/capabilities/src/sys/kern/sys_capability.c#24 edit

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/sys/kern/kern_descrip.c#24 (text+ko) ====

@@ -85,6 +85,7 @@
 #include <security/audit/audit.h>
 
 #include <vm/uma.h>
+#include <vm/vm.h>
 
 #include <ddb/ddb.h>
 
@@ -2200,13 +2201,22 @@
 		}
 
 		/*
-		 * Hold the new file descriptor and drop the capability file
-		 * descriptor; after this point fp refers to the new object.
+		 * If cap_fextract() returned a different file descriptor
+		 * than was passed in, drop the original capability and hold
+		 * the new descriptor.  fp after this point refers to the
+		 * actual object, not the capability.
 		 */
-		fhold(fp_fromcap);
-		fdrop(fp, td);
-		fp = fp_fromcap;
-#endif
+		if (fp != fp_fromcap) {
+			fhold(fp_fromcap);
+			fdrop(fp, td);
+			fp = fp_fromcap;
+		}
+#else /* !CAPABILITIES */
+		KASSERT(fp->f_type != DTYPE_CAPABILITY,
+		    ("_fget: saw capability"));
+		if (maxprotp != NULL)
+			*maxprotp = VM_PROT_ALL;
+#endif /* CAPABILITIES */
 		if ((flags == FREAD && (fp->f_flag & FREAD) == 0) ||
 		    (flags == FWRITE && (fp->f_flag & FWRITE) == 0)) {
 			fdrop(fp, td);

==== //depot/projects/trustedbsd/capabilities/src/sys/kern/sys_capability.c#24 (text+ko) ====

@@ -50,7 +50,7 @@
 #include "opt_capabilities.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$P4: //depot/projects/trustedbsd/capabilities/src/sys/kern/sys_capability.c#23 $");
+__FBSDID("$P4: //depot/projects/trustedbsd/capabilities/src/sys/kern/sys_capability.c#24 $");
 
 #include <sys/param.h>
 #include <sys/capability.h>


More information about the p4-projects mailing list