acl: return EOPNOTSUPP in posix_acl_fix_xattr_common()
authorChristian Brauner <brauner@kernel.org>
Mon, 29 Aug 2022 12:38:41 +0000 (14:38 +0200)
committerChristian Brauner (Microsoft) <brauner@kernel.org>
Wed, 31 Aug 2022 06:49:49 +0000 (08:49 +0200)
Return EOPNOTSUPP when the POSIX ACL version doesn't match and zero if
there are no entries. This will allow us to reuse the helper in
posix_acl_from_xattr(). This change will have no user visible effects.

Fixes: 0c5fd887d2bb ("acl: move idmapped mount fixup into vfs_{g,s}etxattr()")
Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Reviewed-by: Seth Forshee (DigitalOcean) <sforshee@kernel.org>>
fs/posix_acl.c

index 5af3380..abe3877 100644 (file)
@@ -710,9 +710,9 @@ EXPORT_SYMBOL(posix_acl_update_mode);
 /*
  * Fix up the uids and gids in posix acl extended attributes in place.
  */
-static int posix_acl_fix_xattr_common(void *value, size_t size)
+static int posix_acl_fix_xattr_common(const void *value, size_t size)
 {
-       struct posix_acl_xattr_header *header = value;
+       const struct posix_acl_xattr_header *header = value;
        int count;
 
        if (!header)
@@ -720,13 +720,13 @@ static int posix_acl_fix_xattr_common(void *value, size_t size)
        if (size < sizeof(struct posix_acl_xattr_header))
                return -EINVAL;
        if (header->a_version != cpu_to_le32(POSIX_ACL_XATTR_VERSION))
-               return -EINVAL;
+               return -EOPNOTSUPP;
 
        count = posix_acl_xattr_count(size);
        if (count < 0)
                return -EINVAL;
        if (count == 0)
-               return -EINVAL;
+               return 0;
 
        return count;
 }
@@ -748,7 +748,7 @@ void posix_acl_getxattr_idmapped_mnt(struct user_namespace *mnt_userns,
                return;
 
        count = posix_acl_fix_xattr_common(value, size);
-       if (count < 0)
+       if (count <= 0)
                return;
 
        for (end = entry + count; entry != end; entry++) {
@@ -788,7 +788,7 @@ void posix_acl_setxattr_idmapped_mnt(struct user_namespace *mnt_userns,
                return;
 
        count = posix_acl_fix_xattr_common(value, size);
-       if (count < 0)
+       if (count <= 0)
                return;
 
        for (end = entry + count; entry != end; entry++) {
@@ -822,7 +822,7 @@ static void posix_acl_fix_xattr_userns(
        kgid_t gid;
 
        count = posix_acl_fix_xattr_common(value, size);
-       if (count < 0)
+       if (count <= 0)
                return;
 
        for (end = entry + count; entry != end; entry++) {
@@ -870,16 +870,9 @@ posix_acl_from_xattr(struct user_namespace *user_ns,
        struct posix_acl *acl;
        struct posix_acl_entry *acl_e;
 
-       if (!value)
-               return NULL;
-       if (size < sizeof(struct posix_acl_xattr_header))
-                return ERR_PTR(-EINVAL);
-       if (header->a_version != cpu_to_le32(POSIX_ACL_XATTR_VERSION))
-               return ERR_PTR(-EOPNOTSUPP);
-
-       count = posix_acl_xattr_count(size);
+       count = posix_acl_fix_xattr_common(value, size);
        if (count < 0)
-               return ERR_PTR(-EINVAL);
+               return ERR_PTR(count);
        if (count == 0)
                return NULL;