aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErnesto A. Fernández <ernesto.mnd.fernandez@gmail.com>2017-07-12 05:55:35 -0400
committerDave Kleikamp <dave.kleikamp@oracle.com>2017-07-18 15:28:06 -0400
commitf070e5ac9bc7de71c34402048ce5526dccbd347c (patch)
tree0afe6371fd903b406173b8b5977cb47b9f59f09c
parent9bcf66c72d726322441ec82962994e69157613e4 (diff)
jfs: preserve i_mode if __jfs_set_acl() fails
When changing a file's acl mask, __jfs_set_acl() will first set the group bits of i_mode to the value of the mask, and only then set the actual extended attribute representing the new acl. If the second part fails (due to lack of space, for example) and the file had no acl attribute to begin with, the system will from now on assume that the mask permission bits are actual group permission bits, potentially granting access to the wrong users. Prevent this by only changing the inode mode after the acl has been set. Signed-off-by: Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com> Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
-rw-r--r--fs/jfs/acl.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/jfs/acl.c b/fs/jfs/acl.c
index 1be45c8d460d..2e71b6e7e646 100644
--- a/fs/jfs/acl.c
+++ b/fs/jfs/acl.c
@@ -108,19 +108,26 @@ int jfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
108{ 108{
109 int rc; 109 int rc;
110 tid_t tid; 110 tid_t tid;
111 int update_mode = 0;
112 umode_t mode = inode->i_mode;
111 113
112 tid = txBegin(inode->i_sb, 0); 114 tid = txBegin(inode->i_sb, 0);
113 mutex_lock(&JFS_IP(inode)->commit_mutex); 115 mutex_lock(&JFS_IP(inode)->commit_mutex);
114 if (type == ACL_TYPE_ACCESS && acl) { 116 if (type == ACL_TYPE_ACCESS && acl) {
115 rc = posix_acl_update_mode(inode, &inode->i_mode, &acl); 117 rc = posix_acl_update_mode(inode, &mode, &acl);
116 if (rc) 118 if (rc)
117 goto end_tx; 119 goto end_tx;
118 inode->i_ctime = current_time(inode); 120 update_mode = 1;
119 mark_inode_dirty(inode);
120 } 121 }
121 rc = __jfs_set_acl(tid, inode, type, acl); 122 rc = __jfs_set_acl(tid, inode, type, acl);
122 if (!rc) 123 if (!rc) {
124 if (update_mode) {
125 inode->i_mode = mode;
126 inode->i_ctime = current_time(inode);
127 mark_inode_dirty(inode);
128 }
123 rc = txCommit(tid, 1, &inode, 0); 129 rc = txCommit(tid, 1, &inode, 0);
130 }
124end_tx: 131end_tx:
125 txEnd(tid); 132 txEnd(tid);
126 mutex_unlock(&JFS_IP(inode)->commit_mutex); 133 mutex_unlock(&JFS_IP(inode)->commit_mutex);