aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChangli Gao <xiaosuo@gmail.com>2010-06-29 07:10:36 -0400
committerJens Axboe <jaxboe@fusionio.com>2010-06-30 02:12:37 -0400
commit19c9a49b432f245c6293508d164a4350f1f2c601 (patch)
treea051c7c6c4c36d03e304c33a549da7ff4765d425 /fs
parent2cb4b05e7647891b46b91c07c9a60304803d1688 (diff)
splice: check f_mode for seekable file
check f_mode for seekable file As a seekable file is allowed without a llseek function, so the old way isn't work any more. Signed-off-by: Changli Gao <xiaosuo@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> ---- fs/splice.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/splice.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/fs/splice.c b/fs/splice.c
index 41900496d3bb..efdbfece9932 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -1372,8 +1372,7 @@ static long do_splice(struct file *in, loff_t __user *off_in,
1372 if (off_in) 1372 if (off_in)
1373 return -ESPIPE; 1373 return -ESPIPE;
1374 if (off_out) { 1374 if (off_out) {
1375 if (!out->f_op || !out->f_op->llseek || 1375 if (!(out->f_mode & FMODE_PWRITE))
1376 out->f_op->llseek == no_llseek)
1377 return -EINVAL; 1376 return -EINVAL;
1378 if (copy_from_user(&offset, off_out, sizeof(loff_t))) 1377 if (copy_from_user(&offset, off_out, sizeof(loff_t)))
1379 return -EFAULT; 1378 return -EFAULT;
@@ -1393,8 +1392,7 @@ static long do_splice(struct file *in, loff_t __user *off_in,
1393 if (off_out) 1392 if (off_out)
1394 return -ESPIPE; 1393 return -ESPIPE;
1395 if (off_in) { 1394 if (off_in) {
1396 if (!in->f_op || !in->f_op->llseek || 1395 if (!(in->f_mode & FMODE_PREAD))
1397 in->f_op->llseek == no_llseek)
1398 return -EINVAL; 1396 return -EINVAL;
1399 if (copy_from_user(&offset, off_in, sizeof(loff_t))) 1397 if (copy_from_user(&offset, off_in, sizeof(loff_t)))
1400 return -EFAULT; 1398 return -EFAULT;