diff options
author | Andreas Gruenbacher <agruenba@redhat.com> | 2016-09-29 17:48:34 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-03-23 08:44:21 +0100 |
commit | c776cff6de5291edffd3f31b4c1750b48756ac48 (patch) | |
tree | e3a0108df96d19be4a8b628be03ffa766a3edbde /net/socket.c | |
parent | c8d66722d84b7d543073edf3459e024869b706e3 (diff) | |
download | linux-stable-c776cff6de5291edffd3f31b4c1750b48756ac48.tar.gz linux-stable-c776cff6de5291edffd3f31b4c1750b48756ac48.tar.bz2 linux-stable-c776cff6de5291edffd3f31b4c1750b48756ac48.zip |
sockfs: getxattr: Fail with -EOPNOTSUPP for invalid attribute names
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>
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/net/socket.c b/net/socket.c index 96133777d17c..e5bb73eb36fe 100644 --- a/net/socket.c +++ b/net/socket.c @@ -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, 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, |