diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_filedesc.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/kern/kern_filedesc.c b/sys/kern/kern_filedesc.c index 5488c35..b95d123 100644 --- a/sys/kern/kern_filedesc.c +++ b/sys/kern/kern_filedesc.c @@ -242,6 +242,10 @@ write(int fd, const void *buf, size_t count) } desc = fd_from_fdnum(td, fd); + if (desc->oflag != O_WRONLY && desc->oflag != O_WRONLY) { + ret = -EACCES; + goto cleanup; + } /* Does this file descriptor exist? */ if (desc == NULL) { @@ -291,15 +295,7 @@ open(const char *pathname, int oflag) return status; } - /* - * TODO: Handle more flags... For now we only support - * O_RDONLY, so deny other flags. - */ - if ((oflag & ~O_RDONLY) != 0){ - fd_close_fdnum(this_td(), fd->fdno); - return -EACCES; - } - + fd->oflag = oflag; fd->vnode = vp; fd->is_dir = (vp->type == VDIR); return fd->fdno; @@ -329,6 +325,10 @@ read(int fd, void *buf, size_t count) return -EBADF; } + if (fd_desc->oflag == O_WRONLY) { + return -EACCES; + } + sio.offset = fd_desc->offset; vnode = fd_desc->vnode; |