chattr-util/acl-util: add helpers that tells us if an inode type can do chattr/acl (#39003)
Split out of #38728 but I think this makes things more readable in general and makes sense on its own.
This commit is contained in:
@@ -41,7 +41,7 @@ int chattr_full(
|
||||
* drivers, where the ioctl might have different effects. Notably, DRM is using the same
|
||||
* ioctl() number. */
|
||||
|
||||
if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode))
|
||||
if (!inode_type_can_chattr(st.st_mode))
|
||||
return -ENOTTY;
|
||||
|
||||
if (mask == 0 && !ret_previous && !ret_final)
|
||||
@@ -140,7 +140,7 @@ int read_attr_fd(int fd, unsigned *ret) {
|
||||
if (fstat(fd, &st) < 0)
|
||||
return -errno;
|
||||
|
||||
if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode))
|
||||
if (!inode_type_can_chattr(st.st_mode))
|
||||
return -ENOTTY;
|
||||
|
||||
_cleanup_close_ int fd_close = -EBADF;
|
||||
@@ -248,3 +248,7 @@ int set_proj_id_recursive(int fd, uint32_t proj_id) {
|
||||
set_proj_id_cb,
|
||||
UINT32_TO_PTR(proj_id));
|
||||
}
|
||||
|
||||
bool inode_type_can_chattr(mode_t mode) {
|
||||
return IN_SET(mode & S_IFMT, S_IFREG, S_IFDIR);
|
||||
}
|
||||
|
||||
@@ -63,3 +63,5 @@ int set_proj_id_recursive(int fd, uint32_t proj_id);
|
||||
static inline int chattr_secret(int fd, ChattrApplyFlags flags) {
|
||||
return chattr_full(fd, NULL, CHATTR_SECRET_FLAGS, CHATTR_SECRET_FLAGS, NULL, NULL, flags|CHATTR_FALLBACK_BITWISE);
|
||||
}
|
||||
|
||||
bool inode_type_can_chattr(mode_t mode);
|
||||
|
||||
@@ -648,3 +648,7 @@ int fd_acl_make_writable_fallback(int fd) {
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int inode_type_can_acl(mode_t mode) {
|
||||
return IN_SET(mode & S_IFMT, S_IFSOCK, S_IFREG, S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO);
|
||||
}
|
||||
|
||||
@@ -53,3 +53,5 @@ static inline int fd_acl_make_writable(int fd) {
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int inode_type_can_acl(mode_t mode);
|
||||
|
||||
@@ -161,7 +161,7 @@ static int patch_acls(int fd, const char *name, const struct stat *st, uid_t shi
|
||||
assert(st);
|
||||
|
||||
/* ACLs are not supported on symlinks, there's no point in trying */
|
||||
if (S_ISLNK(st->st_mode))
|
||||
if (!inode_type_can_acl(st->st_mode))
|
||||
return 0;
|
||||
|
||||
r = get_acl(fd, name, ACL_TYPE_ACCESS, &acl);
|
||||
|
||||
@@ -1459,8 +1459,8 @@ static int fd_set_acls(
|
||||
"Refusing to set ACLs on hardlinked file %s while the fs.protected_hardlinks sysctl is turned off.",
|
||||
path);
|
||||
|
||||
if (S_ISLNK(st->st_mode)) {
|
||||
log_debug("Skipping ACL fix for symlink %s.", path);
|
||||
if (!inode_type_can_acl(st->st_mode)) {
|
||||
log_debug("Skipping ACL fix for '%s' (inode type does not support ACLs).", path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user