Whamcloud - gitweb
libext2fs: fix translation of Posix ACL's on big-endian systems
authorTheodore Ts'o <tytso@mit.edu>
Fri, 30 Jul 2021 16:29:44 +0000 (12:29 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 30 Jul 2021 16:29:44 +0000 (12:29 -0400)
The ACL returned by the kernel in lgetxattr(2) is returned in Little
Endian, even on Big Endian systems.  Fix the functions
convert_posix_acl_to_disk_buffer() and convert_disk_buffer_to_posix_acl()
to work correctly on Big Endian systems.  This fixes a failure of
the test m_rootdir_acl.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/ext2fs/ext_attr.c

index 148fae5..4f6371d 100644 (file)
@@ -556,10 +556,10 @@ static errcode_t convert_posix_acl_to_disk_buffer(const void *value, size_t size
        s = sizeof(ext4_acl_header);
        for (end = entry + count; entry != end;entry++) {
                ext4_acl_entry *disk_entry = (ext4_acl_entry*) e;
-               disk_entry->e_tag = ext2fs_cpu_to_le16(entry->e_tag);
-               disk_entry->e_perm = ext2fs_cpu_to_le16(entry->e_perm);
+               disk_entry->e_tag = entry->e_tag;
+               disk_entry->e_perm = entry->e_perm;
 
-               switch(entry->e_tag) {
+               switch(ext2fs_le16_to_cpu(entry->e_tag)) {
                        case ACL_USER_OBJ:
                        case ACL_GROUP_OBJ:
                        case ACL_MASK:
@@ -569,7 +569,7 @@ static errcode_t convert_posix_acl_to_disk_buffer(const void *value, size_t size
                                break;
                        case ACL_USER:
                        case ACL_GROUP:
-                               disk_entry->e_id =  ext2fs_cpu_to_le32(entry->e_id);
+                               disk_entry->e_id = entry->e_id;
                                e += sizeof(ext4_acl_entry);
                                s += sizeof(ext4_acl_entry);
                                break;
@@ -608,10 +608,10 @@ static errcode_t convert_disk_buffer_to_posix_acl(const void *value, size_t size
        while (size > 0) {
                const ext4_acl_entry *disk_entry = (const ext4_acl_entry *) cp;
 
-               entry->e_tag = ext2fs_le16_to_cpu(disk_entry->e_tag);
-               entry->e_perm = ext2fs_le16_to_cpu(disk_entry->e_perm);
+               entry->e_tag = disk_entry->e_tag;
+               entry->e_perm = disk_entry->e_perm;
 
-               switch(entry->e_tag) {
+               switch(ext2fs_le16_to_cpu(entry->e_tag)) {
                        case ACL_USER_OBJ:
                        case ACL_GROUP_OBJ:
                        case ACL_MASK:
@@ -622,7 +622,7 @@ static errcode_t convert_disk_buffer_to_posix_acl(const void *value, size_t size
                                break;
                        case ACL_USER:
                        case ACL_GROUP:
-                               entry->e_id = ext2fs_le32_to_cpu(disk_entry->e_id);
+                               entry->e_id = disk_entry->e_id;
                                cp += sizeof(ext4_acl_entry);
                                size -= sizeof(ext4_acl_entry);
                                break;