diff options
-rw-r--r-- | xlators/storage/posix/src/posix-inode-fd-ops.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c index edd3fc1db3f..81569779fd2 100644 --- a/xlators/storage/posix/src/posix-inode-fd-ops.c +++ b/xlators/storage/posix/src/posix-inode-fd-ops.c @@ -1375,6 +1375,17 @@ posix_open (call_frame_t *frame, xlator_t *this, priv = this->private; VALIDATE_OR_GOTO (priv, out); + if (loc->inode && + ((loc->inode->ia_type == IA_IFBLK) || + (loc->inode->ia_type == IA_IFCHR))) { + gf_msg (this->name, GF_LOG_ERROR, EINVAL, + P_MSG_INVALID_ARGUMENT, + "open received on a block/char file (%s)", + uuid_utoa (loc->inode->gfid)); + op_errno = EINVAL; + goto out; + } + if (flags & O_CREAT) DISK_SPACE_CHECK_AND_GOTO (frame, priv, xdata, op_ret, op_errno, out); @@ -1471,6 +1482,17 @@ posix_readv (call_frame_t *frame, xlator_t *this, priv = this->private; VALIDATE_OR_GOTO (priv, out); + if (fd->inode && + ((fd->inode->ia_type == IA_IFBLK) || + (fd->inode->ia_type == IA_IFCHR))) { + gf_msg (this->name, GF_LOG_ERROR, EINVAL, + P_MSG_INVALID_ARGUMENT, + "readv received on a block/char file (%s)", + uuid_utoa (fd->inode->gfid)); + op_errno = EINVAL; + goto out; + } + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, @@ -1740,6 +1762,17 @@ posix_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, VALIDATE_OR_GOTO (priv, out); DISK_SPACE_CHECK_AND_GOTO (frame, priv, xdata, op_ret, op_errno, out); + if (fd->inode && + ((fd->inode->ia_type == IA_IFBLK) || + (fd->inode->ia_type == IA_IFCHR))) { + gf_msg (this->name, GF_LOG_ERROR, EINVAL, + P_MSG_INVALID_ARGUMENT, + "writev received on a block/char file (%s)", + uuid_utoa (fd->inode->gfid)); + op_errno = EINVAL; + goto out; + } + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { gf_msg (this->name, GF_LOG_WARNING, ret, P_MSG_PFD_NULL, |