]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
new helpers: file_listxattr(), filename_listxattr()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 26 Sep 2024 21:53:13 +0000 (17:53 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 6 Nov 2024 17:59:39 +0000 (12:59 -0500)
switch path_listxattr() and flistxattr(2) to those

Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/xattr.c

index d55f3d1e758934a199eadd0bdf878392e865d9a2..988ea737ae7e9b0e45204b24c4b2d3229d5c5c79 100644 (file)
@@ -888,24 +888,43 @@ listxattr(struct dentry *d, char __user *list, size_t size)
        return error;
 }
 
-static ssize_t path_listxattr(const char __user *pathname, char __user *list,
-                             size_t size, unsigned int lookup_flags)
+static
+ssize_t file_listxattr(struct file *f, char __user *list, size_t size)
+{
+       audit_file(f);
+       return listxattr(f->f_path.dentry, list, size);
+}
+
+/* unconditionally consumes filename */
+static
+ssize_t filename_listxattr(int dfd, struct filename *filename,
+                          unsigned int lookup_flags,
+                          char __user *list, size_t size)
 {
        struct path path;
        ssize_t error;
 retry:
-       error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
+       error = filename_lookup(dfd, filename, lookup_flags, &path, NULL);
        if (error)
-               return error;
+               goto out;
        error = listxattr(path.dentry, list, size);
        path_put(&path);
        if (retry_estale(error, lookup_flags)) {
                lookup_flags |= LOOKUP_REVAL;
                goto retry;
        }
+out:
+       putname(filename);
        return error;
 }
 
+static ssize_t path_listxattr(const char __user *pathname, char __user *list,
+                             size_t size, unsigned int lookup_flags)
+{
+       return filename_listxattr(AT_FDCWD, getname(pathname), lookup_flags,
+                                 list, size);
+}
+
 SYSCALL_DEFINE3(listxattr, const char __user *, pathname, char __user *, list,
                size_t, size)
 {
@@ -924,8 +943,7 @@ SYSCALL_DEFINE3(flistxattr, int, fd, char __user *, list, size_t, size)
 
        if (fd_empty(f))
                return -EBADF;
-       audit_file(fd_file(f));
-       return listxattr(fd_file(f)->f_path.dentry, list, size);
+       return file_listxattr(fd_file(f), list, size);
 }
 
 /*