| From 07a2daab49c549a37b5b744cbebb6e3f445f12bc Mon Sep 17 00:00:00 2001 |
| From: Vivek Goyal <vgoyal@redhat.com> |
| Date: Fri, 1 Jul 2016 16:34:25 -0400 |
| Subject: ovl: Copy up underlying inode's ->i_mode to overlay inode |
| |
| From: Vivek Goyal <vgoyal@redhat.com> |
| |
| commit 07a2daab49c549a37b5b744cbebb6e3f445f12bc upstream. |
| |
| Right now when a new overlay inode is created, we initialize overlay |
| inode's ->i_mode from underlying inode ->i_mode but we retain only |
| file type bits (S_IFMT) and discard permission bits. |
| |
| This patch changes it and retains permission bits too. This should allow |
| overlay to do permission checks on overlay inode itself in task context. |
| |
| [SzM] It also fixes clearing suid/sgid bits on write. |
| |
| Signed-off-by: Vivek Goyal <vgoyal@redhat.com> |
| Reported-by: Eryu Guan <eguan@redhat.com> |
| Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> |
| Fixes: 4bacc9c9234c ("overlayfs: Make f_path always point to the overlay and f_inode to the underlay") |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/overlayfs/inode.c | 3 +-- |
| fs/overlayfs/overlayfs.h | 1 + |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/overlayfs/inode.c |
| +++ b/fs/overlayfs/inode.c |
| @@ -412,12 +412,11 @@ struct inode *ovl_new_inode(struct super |
| if (!inode) |
| return NULL; |
| |
| - mode &= S_IFMT; |
| - |
| inode->i_ino = get_next_ino(); |
| inode->i_mode = mode; |
| inode->i_flags |= S_NOATIME | S_NOCMTIME; |
| |
| + mode &= S_IFMT; |
| switch (mode) { |
| case S_IFDIR: |
| inode->i_private = oe; |
| --- a/fs/overlayfs/overlayfs.h |
| +++ b/fs/overlayfs/overlayfs.h |
| @@ -181,6 +181,7 @@ static inline void ovl_copyattr(struct i |
| { |
| to->i_uid = from->i_uid; |
| to->i_gid = from->i_gid; |
| + to->i_mode = from->i_mode; |
| } |
| |
| /* dir.c */ |