diff options
author | mjg <mjg@FreeBSD.org> | 2012-07-08 00:51:38 +0000 |
---|---|---|
committer | mjg <mjg@FreeBSD.org> | 2012-07-08 00:51:38 +0000 |
commit | 1e0d3fae01871e2dc80f05ead912d9a1d4f56f15 (patch) | |
tree | 8ef867fed21ee04518bd48270e5ff95f96ab8e74 /sys/kern/kern_descrip.c | |
parent | b9655c9adb908d7d26aae414f1d9186c1bae160e (diff) | |
download | FreeBSD-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.c | 13 |
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, |