[PATCH 1/2] erofs-utils: fsck: keep S{U,G}ID bits properly on extraction

Gao Xiang hsiangkao at linux.alibaba.com
Fri Jan 24 20:06:27 AEDT 2025


As chown(2) shown, "
When the owner or group of an executable file are changed by an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared.
POSIX does not specify whether this also should happen when root does
the chown(); the Linux behavior depends on the kernel version."

Fix it by chown() first.

Fixes: 412c8f908132 ("erofs-utils: fsck: add --extract=X support to extract to path X")
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 fsck/main.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/fsck/main.c b/fsck/main.c
index d375835..b1d6214 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -300,6 +300,12 @@ static void erofsfsck_set_attributes(struct erofs_inode *inode, char *path)
 #endif
 		erofs_warn("failed to set times: %s", path);
 
+	if (fsckcfg.preserve_owner) {
+		ret = lchown(path, inode->i_uid, inode->i_gid);
+		if (ret < 0)
+			erofs_warn("failed to change ownership: %s", path);
+	}
+
 	if (!S_ISLNK(inode->i_mode)) {
 		if (fsckcfg.preserve_perms)
 			ret = chmod(path, inode->i_mode);
@@ -308,12 +314,6 @@ static void erofsfsck_set_attributes(struct erofs_inode *inode, char *path)
 		if (ret < 0)
 			erofs_warn("failed to set permissions: %s", path);
 	}
-
-	if (fsckcfg.preserve_owner) {
-		ret = lchown(path, inode->i_uid, inode->i_gid);
-		if (ret < 0)
-			erofs_warn("failed to change ownership: %s", path);
-	}
 }
 
 static int erofs_check_sb_chksum(void)
-- 
2.43.5



More information about the Linux-erofs mailing list