From 3fa459d162c932db5bf0494ccf8ed58388dbc287 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Mon, 27 Jan 2025 15:43:24 -0600 Subject: [PATCH] fix vfs/utils.c for big-endian systems generic/633 was failing with EINVAL on the fsxgetattr call on s390. Looks like this is due to a failure to properly endian swap the arguments to the syscall, so fix that, and the magic_etc compare in expected_dummy_vfs_caps_uid() as well while we're at it. Fixes: 0d1af68e ("generic: add fstests for idmapped mounts") Signed-off-by: Eric Sandeen Reviewed-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Signed-off-by: Zorro Lang --- src/vfs/utils.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vfs/utils.c b/src/vfs/utils.c index c1c7951c4..52bb7e428 100644 --- a/src/vfs/utils.c +++ b/src/vfs/utils.c @@ -650,7 +650,7 @@ bool expected_dummy_vfs_caps_uid(int fd, uid_t expected_uid) if (ret < 0 || ret == 0) return false; - if (ns_xattr.magic_etc & VFS_CAP_REVISION_3) { + if (le32_to_cpu(ns_xattr.magic_etc) & VFS_CAP_REVISION_3) { if (le32_to_cpu(ns_xattr.rootid) != expected_uid) { errno = EINVAL; @@ -673,10 +673,12 @@ int set_dummy_vfs_caps(int fd, int flags, int rootuid) ns_cap_data.data[(x) >> 5].permitted |= (1 << ((x)&31)) struct vfs_ns_cap_data ns_xattr; + __le32 magic_etc; memset(&ns_xattr, 0, sizeof(ns_xattr)); __raise_cap_permitted(CAP_NET_RAW, ns_xattr); - ns_xattr.magic_etc |= VFS_CAP_REVISION_3 | VFS_CAP_FLAGS_EFFECTIVE; + magic_etc = (VFS_CAP_REVISION_3 | VFS_CAP_FLAGS_EFFECTIVE); + ns_xattr.magic_etc |= cpu_to_le32(magic_etc); ns_xattr.rootid = cpu_to_le32(rootuid); return fsetxattr(fd, "security.capability", -- 2.49.0