Message ID | 1491555701-16608-2-git-send-email-amir73il@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Apr 7, 2017 at 11:01 AM, Amir Goldstein <amir73il@gmail.com> wrote: > ftruncate an overlayfs inode was checking IS_APPEND() on > overlay inode, but overlay inode does not have the S_APPEND flag. > > Set 'inode' var to file_inode() so all checks are performed on > the real inode and use the overlay inode/sb explicitly for > freeze protection and file lock checks. If you'd just add the file_inode() to the IS_APPEND check then the patch would look a lot less complicated and the effect should be exactly the same. Am I missing something? Thanks, Miklos > > Signed-off-by: Amir Goldstein <amir73il@gmail.com> > --- > fs/open.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/fs/open.c b/fs/open.c > index 949cef2..b7d5ab1 100644 > --- a/fs/open.c > +++ b/fs/open.c > @@ -182,7 +182,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) > small = 0; > > dentry = f.file->f_path.dentry; > - inode = dentry->d_inode; > + inode = file_inode(f.file); > error = -EINVAL; > if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE)) > goto out_putf; > @@ -196,13 +196,13 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) > if (IS_APPEND(inode)) > goto out_putf; > > - sb_start_write(inode->i_sb); > - error = locks_verify_truncate(inode, f.file, length); > + sb_start_write(dentry->d_sb); > + error = locks_verify_truncate(d_inode(dentry), f.file, length); > if (!error) > error = security_path_truncate(&f.file->f_path); > if (!error) > error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file); > - sb_end_write(inode->i_sb); > + sb_end_write(dentry->d_sb); > out_putf: > fdput(f); > out: > -- > 2.7.4 >
On Fri, Apr 7, 2017 at 4:10 PM, Miklos Szeredi <miklos@szeredi.hu> wrote: > On Fri, Apr 7, 2017 at 11:01 AM, Amir Goldstein <amir73il@gmail.com> wrote: >> ftruncate an overlayfs inode was checking IS_APPEND() on >> overlay inode, but overlay inode does not have the S_APPEND flag. >> >> Set 'inode' var to file_inode() so all checks are performed on >> the real inode and use the overlay inode/sb explicitly for >> freeze protection and file lock checks. > > If you'd just add the file_inode() to the IS_APPEND check then the > patch would look a lot less complicated and the effect should be > exactly the same. Am I missing something? > Technically you are right. Social engineering wise, its quite hard to look at a random vfs function and say what 'inode' stands. I surveyed some functions and found that in most cases where file->f_inode is set a local var named inode stands for file_inode() and locks_inode() is the exception, so this patch brings do_sys_ftruncate() into compliance. > Thanks, > Miklos > >> >> Signed-off-by: Amir Goldstein <amir73il@gmail.com> >> --- >> fs/open.c | 8 ++++---- >> 1 file changed, 4 insertions(+), 4 deletions(-) >> >> diff --git a/fs/open.c b/fs/open.c >> index 949cef2..b7d5ab1 100644 >> --- a/fs/open.c >> +++ b/fs/open.c >> @@ -182,7 +182,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) >> small = 0; >> >> dentry = f.file->f_path.dentry; >> - inode = dentry->d_inode; >> + inode = file_inode(f.file); >> error = -EINVAL; >> if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE)) >> goto out_putf; >> @@ -196,13 +196,13 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) >> if (IS_APPEND(inode)) >> goto out_putf; >> >> - sb_start_write(inode->i_sb); >> - error = locks_verify_truncate(inode, f.file, length); >> + sb_start_write(dentry->d_sb); >> + error = locks_verify_truncate(d_inode(dentry), f.file, length); >> if (!error) >> error = security_path_truncate(&f.file->f_path); >> if (!error) >> error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file); >> - sb_end_write(inode->i_sb); >> + sb_end_write(dentry->d_sb); >> out_putf: >> fdput(f); >> out: >> -- >> 2.7.4 >>
diff --git a/fs/open.c b/fs/open.c index 949cef2..b7d5ab1 100644 --- a/fs/open.c +++ b/fs/open.c @@ -182,7 +182,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) small = 0; dentry = f.file->f_path.dentry; - inode = dentry->d_inode; + inode = file_inode(f.file); error = -EINVAL; if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE)) goto out_putf; @@ -196,13 +196,13 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) if (IS_APPEND(inode)) goto out_putf; - sb_start_write(inode->i_sb); - error = locks_verify_truncate(inode, f.file, length); + sb_start_write(dentry->d_sb); + error = locks_verify_truncate(d_inode(dentry), f.file, length); if (!error) error = security_path_truncate(&f.file->f_path); if (!error) error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file); - sb_end_write(inode->i_sb); + sb_end_write(dentry->d_sb); out_putf: fdput(f); out:
ftruncate an overlayfs inode was checking IS_APPEND() on overlay inode, but overlay inode does not have the S_APPEND flag. Set 'inode' var to file_inode() so all checks are performed on the real inode and use the overlay inode/sb explicitly for freeze protection and file lock checks. Signed-off-by: Amir Goldstein <amir73il@gmail.com> --- fs/open.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)