diff options
Diffstat (limited to 'fs/ext2/acl.c')
-rw-r--r-- | fs/ext2/acl.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c index 35d6a3cfd9ff..110b6b371a4e 100644 --- a/fs/ext2/acl.c +++ b/fs/ext2/acl.c | |||
@@ -53,16 +53,23 @@ ext2_acl_from_disk(const void *value, size_t size) | |||
53 | case ACL_OTHER: | 53 | case ACL_OTHER: |
54 | value = (char *)value + | 54 | value = (char *)value + |
55 | sizeof(ext2_acl_entry_short); | 55 | sizeof(ext2_acl_entry_short); |
56 | acl->a_entries[n].e_id = ACL_UNDEFINED_ID; | ||
57 | break; | 56 | break; |
58 | 57 | ||
59 | case ACL_USER: | 58 | case ACL_USER: |
59 | value = (char *)value + sizeof(ext2_acl_entry); | ||
60 | if ((char *)value > end) | ||
61 | goto fail; | ||
62 | acl->a_entries[n].e_uid = | ||
63 | make_kuid(&init_user_ns, | ||
64 | le32_to_cpu(entry->e_id)); | ||
65 | break; | ||
60 | case ACL_GROUP: | 66 | case ACL_GROUP: |
61 | value = (char *)value + sizeof(ext2_acl_entry); | 67 | value = (char *)value + sizeof(ext2_acl_entry); |
62 | if ((char *)value > end) | 68 | if ((char *)value > end) |
63 | goto fail; | 69 | goto fail; |
64 | acl->a_entries[n].e_id = | 70 | acl->a_entries[n].e_gid = |
65 | le32_to_cpu(entry->e_id); | 71 | make_kgid(&init_user_ns, |
72 | le32_to_cpu(entry->e_id)); | ||
66 | break; | 73 | break; |
67 | 74 | ||
68 | default: | 75 | default: |
@@ -96,14 +103,19 @@ ext2_acl_to_disk(const struct posix_acl *acl, size_t *size) | |||
96 | ext_acl->a_version = cpu_to_le32(EXT2_ACL_VERSION); | 103 | ext_acl->a_version = cpu_to_le32(EXT2_ACL_VERSION); |
97 | e = (char *)ext_acl + sizeof(ext2_acl_header); | 104 | e = (char *)ext_acl + sizeof(ext2_acl_header); |
98 | for (n=0; n < acl->a_count; n++) { | 105 | for (n=0; n < acl->a_count; n++) { |
106 | const struct posix_acl_entry *acl_e = &acl->a_entries[n]; | ||
99 | ext2_acl_entry *entry = (ext2_acl_entry *)e; | 107 | ext2_acl_entry *entry = (ext2_acl_entry *)e; |
100 | entry->e_tag = cpu_to_le16(acl->a_entries[n].e_tag); | 108 | entry->e_tag = cpu_to_le16(acl_e->e_tag); |
101 | entry->e_perm = cpu_to_le16(acl->a_entries[n].e_perm); | 109 | entry->e_perm = cpu_to_le16(acl_e->e_perm); |
102 | switch(acl->a_entries[n].e_tag) { | 110 | switch(acl_e->e_tag) { |
103 | case ACL_USER: | 111 | case ACL_USER: |
112 | entry->e_id = cpu_to_le32( | ||
113 | from_kuid(&init_user_ns, acl_e->e_uid)); | ||
114 | e += sizeof(ext2_acl_entry); | ||
115 | break; | ||
104 | case ACL_GROUP: | 116 | case ACL_GROUP: |
105 | entry->e_id = | 117 | entry->e_id = cpu_to_le32( |
106 | cpu_to_le32(acl->a_entries[n].e_id); | 118 | from_kgid(&init_user_ns, acl_e->e_gid)); |
107 | e += sizeof(ext2_acl_entry); | 119 | e += sizeof(ext2_acl_entry); |
108 | break; | 120 | break; |
109 | 121 | ||
@@ -350,7 +362,7 @@ ext2_xattr_get_acl(struct dentry *dentry, const char *name, void *buffer, | |||
350 | return PTR_ERR(acl); | 362 | return PTR_ERR(acl); |
351 | if (acl == NULL) | 363 | if (acl == NULL) |
352 | return -ENODATA; | 364 | return -ENODATA; |
353 | error = posix_acl_to_xattr(acl, buffer, size); | 365 | error = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); |
354 | posix_acl_release(acl); | 366 | posix_acl_release(acl); |
355 | 367 | ||
356 | return error; | 368 | return error; |
@@ -371,7 +383,7 @@ ext2_xattr_set_acl(struct dentry *dentry, const char *name, const void *value, | |||
371 | return -EPERM; | 383 | return -EPERM; |
372 | 384 | ||
373 | if (value) { | 385 | if (value) { |
374 | acl = posix_acl_from_xattr(value, size); | 386 | acl = posix_acl_from_xattr(&init_user_ns, value, size); |
375 | if (IS_ERR(acl)) | 387 | if (IS_ERR(acl)) |
376 | return PTR_ERR(acl); | 388 | return PTR_ERR(acl); |
377 | else if (acl) { | 389 | else if (acl) { |