splice: introduce FMODE_SPLICE_READ and FMODE_SPLICE_WRITE
Introduce FMODE_SPLICE_READ and FMODE_SPLICE_WRITE. These modes check whether it is legal to read or write a file using splice. Both get automatically set on regular files and are not checked when a 'struct fileoperations' includes the splice_{read,write} methods. Change-Id: Ice6a3fab20bf0ac131f8d908f4bb0f7dc34bf4e3 Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de> CVE-2016-9576 Signed-off-by: Kevin F. Haggerty <haggertk@lineageos.org>
This commit is contained in:
parent
8d05b01e19
commit
ce12075aef
|
@ -691,6 +691,10 @@ static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
|
|||
return f;
|
||||
}
|
||||
|
||||
if (S_ISREG(inode->i_mode))
|
||||
f->f_mode |= FMODE_SPLICE_WRITE | FMODE_SPLICE_READ;
|
||||
|
||||
|
||||
f->f_op = fops_get(inode->i_fop);
|
||||
|
||||
error = security_dentry_open(f, cred);
|
||||
|
|
|
@ -379,6 +379,9 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
|
|||
index++;
|
||||
}
|
||||
|
||||
if (unlikely(!(in->f_mode & FMODE_SPLICE_READ)))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Now loop over the map and see if we need to start IO on any
|
||||
* pages, fill in the partial map, etc.
|
||||
|
@ -1073,6 +1076,9 @@ static ssize_t default_file_splice_write(struct pipe_inode_info *pipe,
|
|||
{
|
||||
ssize_t ret;
|
||||
|
||||
if (unlikely(!(out->f_mode & FMODE_SPLICE_WRITE)))
|
||||
return -EINVAL;
|
||||
|
||||
ret = splice_from_pipe(pipe, out, ppos, len, flags, write_pipe_buf);
|
||||
if (ret > 0)
|
||||
*ppos += ret;
|
||||
|
|
|
@ -123,6 +123,11 @@ struct inodes_stat_t {
|
|||
/* File was opened by fanotify and shouldn't generate fanotify events */
|
||||
#define FMODE_NONOTIFY ((__force fmode_t)0x1000000)
|
||||
|
||||
/* File can be read using splice */
|
||||
#define FMODE_SPLICE_READ ((__force fmode_t)0x8000000)
|
||||
/* File can be written using splice */
|
||||
#define FMODE_SPLICE_WRITE ((__force fmode_t)0x10000000)
|
||||
|
||||
/*
|
||||
* The below are the various read and write types that we support. Some of
|
||||
* them include behavioral modifiers that send information down to the
|
||||
|
|
Loading…
Reference in New Issue