summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_descrip.c
diff options
context:
space:
mode:
authormjg <mjg@FreeBSD.org>2012-07-08 00:51:38 +0000
committermjg <mjg@FreeBSD.org>2012-07-08 00:51:38 +0000
commit1e0d3fae01871e2dc80f05ead912d9a1d4f56f15 (patch)
tree8ef867fed21ee04518bd48270e5ff95f96ab8e74 /sys/kern/kern_descrip.c
parentb9655c9adb908d7d26aae414f1d9186c1bae160e (diff)
downloadFreeBSD-src-1e0d3fae01871e2dc80f05ead912d9a1d4f56f15.zip
FreeBSD-src-1e0d3fae01871e2dc80f05ead912d9a1d4f56f15.tar.gz
Unbreak handling of descriptors opened with O_EXEC by fexecve(2).
While here return EBADF for descriptors opened for writing (previously it was ETXTBSY). Add fgetvp_exec function which performs appropriate checks. PR: kern/169651 In collaboration with: kib Approved by: trasz (mentor) MFC after: 1 week
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r--sys/kern/kern_descrip.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index d16746a..a4b7580 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -2340,11 +2340,11 @@ _fget(struct thread *td, int fd, struct file **fpp, int flags,
/*
* FREAD and FWRITE failure return EBADF as per POSIX.
- *
- * Only one flag, or 0, may be specified.
*/
if ((flags == FREAD && (fp->f_flag & FREAD) == 0) ||
- (flags == FWRITE && (fp->f_flag & FWRITE) == 0)) {
+ (flags == FWRITE && (fp->f_flag & FWRITE) == 0) ||
+ (flags == (FREAD | FEXEC) &&
+ (((fp->f_flag & flags) == 0) || ((fp->f_flag & FWRITE) != 0)))) {
fdrop(fp, td);
return (EBADF);
}
@@ -2444,6 +2444,13 @@ fgetvp_read(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp)
return (_fgetvp(td, fd, FREAD, rights, NULL, vpp));
}
+int
+fgetvp_exec(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp)
+{
+
+ return (_fgetvp(td, fd, FREAD | FEXEC, rights, NULL, vpp));
+}
+
#ifdef notyet
int
fgetvp_write(struct thread *td, int fd, cap_rights_t rights,
OpenPOWER on IntegriCloud