diff options
Diffstat (limited to 'fs/reiserfs/xattr_acl.c')
-rw-r--r-- | fs/reiserfs/xattr_acl.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c index 44474f9b990d..d7c01ef64eda 100644 --- a/fs/reiserfs/xattr_acl.c +++ b/fs/reiserfs/xattr_acl.c | |||
@@ -30,7 +30,7 @@ posix_acl_set(struct dentry *dentry, const char *name, const void *value, | |||
30 | return -EPERM; | 30 | return -EPERM; |
31 | 31 | ||
32 | if (value) { | 32 | if (value) { |
33 | acl = posix_acl_from_xattr(value, size); | 33 | acl = posix_acl_from_xattr(&init_user_ns, value, size); |
34 | if (IS_ERR(acl)) { | 34 | if (IS_ERR(acl)) { |
35 | return PTR_ERR(acl); | 35 | return PTR_ERR(acl); |
36 | } else if (acl) { | 36 | } else if (acl) { |
@@ -77,7 +77,7 @@ posix_acl_get(struct dentry *dentry, const char *name, void *buffer, | |||
77 | return PTR_ERR(acl); | 77 | return PTR_ERR(acl); |
78 | if (acl == NULL) | 78 | if (acl == NULL) |
79 | return -ENODATA; | 79 | return -ENODATA; |
80 | error = posix_acl_to_xattr(acl, buffer, size); | 80 | error = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); |
81 | posix_acl_release(acl); | 81 | posix_acl_release(acl); |
82 | 82 | ||
83 | return error; | 83 | return error; |
@@ -121,15 +121,23 @@ static struct posix_acl *posix_acl_from_disk(const void *value, size_t size) | |||
121 | case ACL_OTHER: | 121 | case ACL_OTHER: |
122 | value = (char *)value + | 122 | value = (char *)value + |
123 | sizeof(reiserfs_acl_entry_short); | 123 | sizeof(reiserfs_acl_entry_short); |
124 | acl->a_entries[n].e_id = ACL_UNDEFINED_ID; | ||
125 | break; | 124 | break; |
126 | 125 | ||
127 | case ACL_USER: | 126 | case ACL_USER: |
127 | value = (char *)value + sizeof(reiserfs_acl_entry); | ||
128 | if ((char *)value > end) | ||
129 | goto fail; | ||
130 | acl->a_entries[n].e_uid = | ||
131 | make_kuid(&init_user_ns, | ||
132 | le32_to_cpu(entry->e_id)); | ||
133 | break; | ||
128 | case ACL_GROUP: | 134 | case ACL_GROUP: |
129 | value = (char *)value + sizeof(reiserfs_acl_entry); | 135 | value = (char *)value + sizeof(reiserfs_acl_entry); |
130 | if ((char *)value > end) | 136 | if ((char *)value > end) |
131 | goto fail; | 137 | goto fail; |
132 | acl->a_entries[n].e_id = le32_to_cpu(entry->e_id); | 138 | acl->a_entries[n].e_gid = |
139 | make_kgid(&init_user_ns, | ||
140 | le32_to_cpu(entry->e_id)); | ||
133 | break; | 141 | break; |
134 | 142 | ||
135 | default: | 143 | default: |
@@ -164,13 +172,19 @@ static void *posix_acl_to_disk(const struct posix_acl *acl, size_t * size) | |||
164 | ext_acl->a_version = cpu_to_le32(REISERFS_ACL_VERSION); | 172 | ext_acl->a_version = cpu_to_le32(REISERFS_ACL_VERSION); |
165 | e = (char *)ext_acl + sizeof(reiserfs_acl_header); | 173 | e = (char *)ext_acl + sizeof(reiserfs_acl_header); |
166 | for (n = 0; n < acl->a_count; n++) { | 174 | for (n = 0; n < acl->a_count; n++) { |
175 | const struct posix_acl_entry *acl_e = &acl->a_entries[n]; | ||
167 | reiserfs_acl_entry *entry = (reiserfs_acl_entry *) e; | 176 | reiserfs_acl_entry *entry = (reiserfs_acl_entry *) e; |
168 | entry->e_tag = cpu_to_le16(acl->a_entries[n].e_tag); | 177 | entry->e_tag = cpu_to_le16(acl->a_entries[n].e_tag); |
169 | entry->e_perm = cpu_to_le16(acl->a_entries[n].e_perm); | 178 | entry->e_perm = cpu_to_le16(acl->a_entries[n].e_perm); |
170 | switch (acl->a_entries[n].e_tag) { | 179 | switch (acl->a_entries[n].e_tag) { |
171 | case ACL_USER: | 180 | case ACL_USER: |
181 | entry->e_id = cpu_to_le32( | ||
182 | from_kuid(&init_user_ns, acl_e->e_uid)); | ||
183 | e += sizeof(reiserfs_acl_entry); | ||
184 | break; | ||
172 | case ACL_GROUP: | 185 | case ACL_GROUP: |
173 | entry->e_id = cpu_to_le32(acl->a_entries[n].e_id); | 186 | entry->e_id = cpu_to_le32( |
187 | from_kgid(&init_user_ns, acl_e->e_gid)); | ||
174 | e += sizeof(reiserfs_acl_entry); | 188 | e += sizeof(reiserfs_acl_entry); |
175 | break; | 189 | break; |
176 | 190 | ||