Message ID | 1491466429-30333-5-git-send-email-amir73il@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
diff --git a/fs/open.c b/fs/open.c index baf67cd..8f1754d 100644 --- a/fs/open.c +++ b/fs/open.c @@ -859,6 +859,15 @@ int vfs_open(const struct path *path, struct file *file, if (IS_ERR(dentry)) return PTR_ERR(dentry); + /* Check append-only open flags also against real inode */ + if (dentry != path->dentry && IS_APPEND(d_backing_inode(dentry))) { + if ((file->f_flags & O_ACCMODE) != O_RDONLY && + !(file->f_flags & O_APPEND)) + return -EPERM; + if (file->f_flags & O_TRUNC) + return -EPERM; + } + file->f_path = *path; return do_dentry_open(file, d_backing_inode(dentry), NULL, cred); }
For overlay file open, check IS_APPEND() on real backing inode inside vfs_open(), because the overlay inode does not have the S_APPEND flag. This seems like the wrong place for this check. Probably better to propagate S_APPEND flag to overlay inode. Signed-off-by: Amir Goldstein <amir73il@gmail.com> --- fs/open.c | 9 +++++++++ 1 file changed, 9 insertions(+)