Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Jul 2012 05:39:31 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r238272 - head/sys/kern
Message-ID:  <201207090539.q695dV3I097678@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Mon Jul  9 05:39:31 2012
New Revision: 238272
URL: http://svn.freebsd.org/changeset/base/238272

Log:
  Follow-up commit to r238220:
  
  Pass only FEXEC (instead of FREAD|FEXEC) in fgetvp_exec. _fget has to check for
  !FWRITE anyway and may as well know about FREAD.
  
  Make _fget code a bit more readable by converting permission checking from if()
  to switch(). Assert that correct permission flags are passed.
  
  In collaboration with:	kib
  Approved by:	trasz (mentor)
  MFC after:	6 days
  X-MFC: with r238220

Modified:
  head/sys/kern/kern_descrip.c

Modified: head/sys/kern/kern_descrip.c
==============================================================================
--- head/sys/kern/kern_descrip.c	Mon Jul  9 05:23:02 2012	(r238271)
+++ head/sys/kern/kern_descrip.c	Mon Jul  9 05:39:31 2012	(r238272)
@@ -2275,8 +2275,8 @@ _fget(struct thread *td, int fd, struct 
 	struct file *fp;
 #ifdef CAPABILITIES
 	struct file *fp_fromcap;
-	int error;
 #endif
+	int error;
 
 	*fpp = NULL;
 	if (td == NULL || (fdp = td->td_proc->p_fd) == NULL)
@@ -2315,7 +2315,7 @@ _fget(struct thread *td, int fd, struct 
 		else
 			error = cap_funwrap_mmap(fp, needrights, maxprotp,
 			    &fp_fromcap);
-		if (error) {
+		if (error != 0) {
 			fdrop(fp, td);
 			return (error);
 		}
@@ -2341,13 +2341,29 @@ _fget(struct thread *td, int fd, struct 
 	/*
 	 * FREAD and FWRITE failure return EBADF as per POSIX.
 	 */
-	if ((flags == FREAD && (fp->f_flag & FREAD) == 0) ||
-	    (flags == FWRITE && (fp->f_flag & FWRITE) == 0) ||
-	    (flags == (FREAD | FEXEC) &&
-	    (((fp->f_flag & flags) == 0) || ((fp->f_flag & FWRITE) != 0)))) {
+	error = 0;
+	switch (flags) {
+	case FREAD:
+	case FWRITE:
+		if ((fp->f_flag & flags) == 0)
+			error = EBADF;
+		break;
+	case FEXEC:
+	    	if ((fp->f_flag & (FREAD | FEXEC)) == 0 ||
+		    ((fp->f_flag & FWRITE) != 0))
+			error = EBADF;
+		break;
+	case 0:
+		break;
+	default:
+		KASSERT(0, ("wrong flags"));
+	}
+
+	if (error != 0) {
 		fdrop(fp, td);
-		return (EBADF);
+		return (error);
 	}
+
 	*fpp = fp;
 	return (0);
 }
@@ -2448,7 +2464,7 @@ int
 fgetvp_exec(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp)
 {
 
-	return (_fgetvp(td, fd, FREAD | FEXEC, rights, NULL, vpp));
+	return (_fgetvp(td, fd, FEXEC, rights, NULL, vpp));
 }
 
 #ifdef notyet



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