Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ocfs2: Handle kuids and kgids in acl/xattr conversions.

Explicitly deal with the different kinds of acls because they need
different conversions.

Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>

+29 -2
+29 -2
fs/ocfs2/acl.c
··· 65 65 66 66 acl->a_entries[n].e_tag = le16_to_cpu(entry->e_tag); 67 67 acl->a_entries[n].e_perm = le16_to_cpu(entry->e_perm); 68 - acl->a_entries[n].e_id = le32_to_cpu(entry->e_id); 68 + switch(acl->a_entries[n].e_tag) { 69 + case ACL_USER: 70 + acl->a_entries[n].e_uid = 71 + make_kuid(&init_user_ns, 72 + le32_to_cpu(entry->e_id)); 73 + break; 74 + case ACL_GROUP: 75 + acl->a_entries[n].e_gid = 76 + make_kgid(&init_user_ns, 77 + le32_to_cpu(entry->e_id)); 78 + break; 79 + default: 80 + break; 81 + } 69 82 value += sizeof(struct posix_acl_entry); 70 83 71 84 } ··· 104 91 for (n = 0; n < acl->a_count; n++, entry++) { 105 92 entry->e_tag = cpu_to_le16(acl->a_entries[n].e_tag); 106 93 entry->e_perm = cpu_to_le16(acl->a_entries[n].e_perm); 107 - entry->e_id = cpu_to_le32(acl->a_entries[n].e_id); 94 + switch(acl->a_entries[n].e_tag) { 95 + case ACL_USER: 96 + entry->e_id = cpu_to_le32( 97 + from_kuid(&init_user_ns, 98 + acl->a_entries[n].e_uid)); 99 + break; 100 + case ACL_GROUP: 101 + entry->e_id = cpu_to_le32( 102 + from_kgid(&init_user_ns, 103 + acl->a_entries[n].e_gid)); 104 + break; 105 + default: 106 + entry->e_id = cpu_to_le32(ACL_UNDEFINED_ID); 107 + break; 108 + } 108 109 } 109 110 return ocfs2_acl; 110 111 }