When encountering suid or sgid files, we already set the `u` or `g` property in the prototype file. Given that proto.c only supports three numbers for permissions, we need to remove the redundant information from the permission, else it was incorrectly parsed. Before: wall --g2755 0 0 rootfs/usr/bin/wall sudo -u-4755 0 0 rootfs/usr/bin/sudo This wrongly generates (suid + 475 permissions): -r-Srwxr-x. 1 root root 514704 Apr 16 11:56 /usr/bin/su After: wall --g755 0 0 rootfs/usr/bin/wall sudo -u-755 0 0 rootfs/usr/bin/sudo This correctly generates (suid + 755 permissions): -rwsr-xr-x 1 root root 514704 Apr 16 11:56 /usr/bin/su Signed-off-by: Luca Di Maio <luca.dimaio1@xxxxxxxxx> --- mkfs/xfs_protofile.in | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mkfs/xfs_protofile.in b/mkfs/xfs_protofile.in index e83c39f..9672ca3 100644 --- a/mkfs/xfs_protofile.in +++ b/mkfs/xfs_protofile.in @@ -43,7 +43,13 @@ def stat_to_str(statbuf): else: sgid = '-' + # We already register suid in the proto string, no need + # to also represent it into the octet perms = stat.S_IMODE(statbuf.st_mode) + if suid == 'u': + perms = perms & ~stat.S_ISUID + if sgid == 'g': + perms = perms & ~stat.S_ISGID return '%s%s%s%03o %d %d' % (type, suid, sgid, perms, statbuf.st_uid, \ statbuf.st_gid) 2.49.0