sockfs: getxattr: Fail with -EOPNOTSUPP for invalid attribute names 13/221213/1
authorAndreas Gruenbacher <agruenba@redhat.com>
Thu, 29 Sep 2016 15:48:34 +0000 (17:48 +0200)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Mon, 30 Dec 2019 06:44:32 +0000 (15:44 +0900)
commit 971df15bd54ad46e907046ff33750a137b2f0096 upstream.

The standard return value for unsupported attribute names is
-EOPNOTSUPP, as opposed to undefined but supported attributes
(-ENODATA).

Also, fail for attribute names like "system.sockprotonameXXX" and
simplify the code a bit.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
[removes a build warning on 4.4.y - gregkh]
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[sw0312.kim: cherry-pick from stable linux-4.4.y commit c776cff6de52 for gcc 9 build]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I86795bc2eb5eac9498341d6778a1a2195272f82a

net/socket.c

index a4a5342c2f71a19fc9a3d762c0aa29ca00762970..e32639b2d505d8a7c2722c36a3d549f9867f904a 100644 (file)
@@ -470,27 +470,15 @@ static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed)
 static ssize_t sockfs_getxattr(struct dentry *dentry, struct inode *inode,
                               const char *name, void *value, size_t size)
 {
-       const char *proto_name;
-       size_t proto_size;
-       int error;
-
-       error = -ENODATA;
-       if (!strncmp(name, XATTR_NAME_SOCKPROTONAME, XATTR_NAME_SOCKPROTONAME_LEN)) {
-               proto_name = dentry->d_name.name;
-               proto_size = strlen(proto_name);
-
+       if (!strcmp(name, XATTR_NAME_SOCKPROTONAME)) {
                if (value) {
-                       error = -ERANGE;
-                       if (proto_size + 1 > size)
-                               goto out;
-
-                       strncpy(value, proto_name, proto_size + 1);
+                       if (dentry->d_name.len + 1 > size)
+                               return -ERANGE;
+                       memcpy(value, dentry->d_name.name, dentry->d_name.len + 1);
                }
-               error = proto_size + 1;
+               return dentry->d_name.len + 1;
        }
-
-out:
-       return error;
+       return -EOPNOTSUPP;
 }
 
 static ssize_t sockfs_listxattr(struct dentry *dentry, char *buffer,