Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18c67cb9 authored by Al Viro's avatar Al Viro
Browse files

splice: lift checks from do_splice_from() into callers



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 68d70d03
Loading
Loading
Loading
Loading
+20 −11
Original line number Original line Diff line number Diff line
@@ -1098,17 +1098,6 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
{
{
	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
				loff_t *, size_t, unsigned int);
				loff_t *, size_t, unsigned int);
	int ret;

	if (unlikely(!(out->f_mode & FMODE_WRITE)))
		return -EBADF;

	if (unlikely(out->f_flags & O_APPEND))
		return -EINVAL;

	ret = rw_verify_area(WRITE, out, ppos, len);
	if (unlikely(ret < 0))
		return ret;


	if (out->f_op && out->f_op->splice_write)
	if (out->f_op && out->f_op->splice_write)
		splice_write = out->f_op->splice_write;
		splice_write = out->f_op->splice_write;
@@ -1303,6 +1292,16 @@ long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
	};
	};
	long ret;
	long ret;


	if (unlikely(!(out->f_mode & FMODE_WRITE)))
		return -EBADF;

	if (unlikely(out->f_flags & O_APPEND))
		return -EINVAL;

	ret = rw_verify_area(WRITE, out, opos, len);
	if (unlikely(ret < 0))
		return ret;

	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
	if (ret > 0)
	if (ret > 0)
		*ppos = sd.pos;
		*ppos = sd.pos;
@@ -1358,6 +1357,16 @@ static long do_splice(struct file *in, loff_t __user *off_in,
			offset = out->f_pos;
			offset = out->f_pos;
		}
		}


		if (unlikely(!(out->f_mode & FMODE_WRITE)))
			return -EBADF;

		if (unlikely(out->f_flags & O_APPEND))
			return -EINVAL;

		ret = rw_verify_area(WRITE, out, &offset, len);
		if (unlikely(ret < 0))
			return ret;

		file_start_write(out);
		file_start_write(out);
		ret = do_splice_from(ipipe, out, &offset, len, flags);
		ret = do_splice_from(ipipe, out, &offset, len, flags);
		file_end_write(out);
		file_end_write(out);