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@xxxxxxxxx> --- fs/open.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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); } -- 2.7.4