dissect-image: mount the ESP with fmask=0177 (#35871)

Avoid showing the files on the ESP (i.e. a FAT formatted volume) as
executable by removing the execute permission from them.

IMO this makes the colored output of `ls` more sensible since the file
system will be mounted with `noexec` anyway.

Add a `fstype_can_fmask_dmask` function that checks if a file system
type can use the `fmask` and `dmask` mount options.

This replaces `fstype_can_umask` since it was only used in
`partition_pick_mount_options` which only cares about the file system
support for fmask & dmask now.

It somewhat reduces the coverage of the feature since there are more file
systems that support umask as opposed to those supporting dmask & dmask,
but it should not be much of an issue since fmask & dmask are supported
by vfat, exfat and ntfs3.
This commit is contained in:
nl6720
2025-01-08 15:19:33 +01:00
committed by GitHub
parent dcb29a931c
commit 96963e5615
4 changed files with 8 additions and 8 deletions
+2 -2
View File
@@ -560,13 +560,13 @@ const char* fstype_norecovery_option(const char *fstype) {
return mount_option_supported(fstype, "norecovery", NULL) > 0 ? "norecovery" : NULL;
}
bool fstype_can_umask(const char *fstype) {
bool fstype_can_fmask_dmask(const char *fstype) {
assert(fstype);
/* Use a curated list as first check, to avoid calling fsopen() which might load kmods, which might
* not be allowed in our MAC context. If we don't know ourselves, on new kernels we can just ask the
* kernel. */
return streq(fstype, "vfat") || mount_option_supported(fstype, "umask", "0077") > 0;
return streq(fstype, "vfat") || (mount_option_supported(fstype, "fmask", "0177") > 0 && mount_option_supported(fstype, "dmask", "0077") > 0);
}
bool fstype_can_uid_gid(const char *fstype) {
+1 -1
View File
@@ -62,7 +62,7 @@ bool fstype_is_blockdev_backed(const char *fstype);
bool fstype_is_ro(const char *fsype);
bool fstype_can_discard(const char *fstype);
bool fstype_can_uid_gid(const char *fstype);
bool fstype_can_umask(const char *fstype);
bool fstype_can_fmask_dmask(const char *fstype);
const char* fstype_norecovery_option(const char *fstype);
+2 -2
View File
@@ -1891,8 +1891,8 @@ int partition_pick_mount_options(
/* The ESP might contain a pre-boot random seed. Let's make this unaccessible to regular
* userspace. ESP/XBOOTLDR is almost certainly VFAT, hence if we don't know assume it is. */
if (!fstype || fstype_can_umask(fstype))
if (!strextend_with_separator(&options, ",", "umask=0077"))
if (!fstype || fstype_can_fmask_dmask(fstype))
if (!strextend_with_separator(&options, ",", "fmask=0177,dmask=0077"))
return -ENOMEM;
break;
+3 -3
View File
@@ -389,9 +389,9 @@ TEST(fstype_can_norecovery) {
ASSERT_NULL(fstype_norecovery_option("tmpfs"));
}
TEST(fstype_can_umask) {
assert_se(fstype_can_umask("vfat"));
assert_se(!fstype_can_umask("tmpfs"));
TEST(fstype_can_fmask_dmask) {
assert_se(fstype_can_fmask_dmask("vfat"));
assert_se(!fstype_can_fmask_dmask("tmpfs"));
}
TEST(path_get_mnt_id_at_null) {