ovl: fold ovl_getxattr() into ovl_get_redirect_xattr()
authorMiklos Szeredi <mszeredi@redhat.com>
Wed, 2 Sep 2020 08:58:48 +0000 (10:58 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 2 Sep 2020 08:58:48 +0000 (10:58 +0200)
This is a partial revert (with some cleanups) of commit 993a0b2aec52 ("ovl:
Do not lose security.capability xattr over metadata file copy-up"), which
introduced ovl_getxattr() in the first place.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/util.c

index feca16a..4cc1366 100644 (file)
@@ -882,49 +882,26 @@ bool ovl_is_metacopy_dentry(struct dentry *dentry)
        return (oe->numlower > 1);
 }
 
-static ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value,
-                           size_t padding)
-{
-       ssize_t res;
-       char *buf = NULL;
-
-       res = vfs_getxattr(dentry, name, NULL, 0);
-       if (res < 0) {
-               if (res == -ENODATA || res == -EOPNOTSUPP)
-                       return -ENODATA;
-               goto fail;
-       }
-
-       if (res != 0) {
-               buf = kzalloc(res + padding, GFP_KERNEL);
-               if (!buf)
-                       return -ENOMEM;
-
-               res = vfs_getxattr(dentry, name, buf, res);
-               if (res < 0)
-                       goto fail;
-       }
-       *value = buf;
-
-       return res;
-
-fail:
-       pr_warn_ratelimited("failed to get xattr %s: err=%zi)\n",
-                           name, res);
-       kfree(buf);
-       return res;
-}
-
 char *ovl_get_redirect_xattr(struct dentry *dentry, int padding)
 {
        int res;
        char *s, *next, *buf = NULL;
 
-       res = ovl_getxattr(dentry, OVL_XATTR_REDIRECT, &buf, padding + 1);
-       if (res == -ENODATA)
+       res = vfs_getxattr(dentry, OVL_XATTR_REDIRECT, NULL, 0);
+       if (res == -ENODATA || res == -EOPNOTSUPP)
                return NULL;
        if (res < 0)
-               return ERR_PTR(res);
+               goto fail;
+       if (res == 0)
+               goto invalid;
+
+       buf = kzalloc(res + padding + 1, GFP_KERNEL);
+       if (!buf)
+               return ERR_PTR(-ENOMEM);
+
+       res = vfs_getxattr(dentry, OVL_XATTR_REDIRECT, buf, res);
+       if (res < 0)
+               goto fail;
        if (res == 0)
                goto invalid;
 
@@ -943,6 +920,10 @@ char *ovl_get_redirect_xattr(struct dentry *dentry, int padding)
 invalid:
        pr_warn_ratelimited("invalid redirect (%s)\n", buf);
        res = -EINVAL;
+       goto err_free;
+fail:
+       pr_warn_ratelimited("failed to get redirect (%i)\n", res);
+err_free:
        kfree(buf);
        return ERR_PTR(res);
 }