From d078a265b932eb6351688fd1ec9df69b239a2485 Mon Sep 17 00:00:00 2001 From: Bill Nottingham Date: Mon, 9 Oct 2006 16:10:48 -0400 Subject: [PATCH] --- yaml --- r: 39167 b: refs/heads/master c: 659564c8adfe1765476beee8d55cd18986946892 h: refs/heads/master i: 39165: 7d5af23f1d4ce8ec8ed55f3b19855594149c07a0 39163: 98a8e3577b2742bc73c1e6fec4a42ee7f66deea1 39159: ef1f0d81ef1b47db2f02e36c79dfdbc3faa121d5 39151: 9978493892f136122c94c23d1b8168e87816aae6 39135: 2138684c48c5aab9f3f59e72582fb2d8119eef6c 39103: d137871117dd8f3ab760f8be98db8ff48e62664d 39039: 6f1151982b2086dd6bdbfb01a3607e83f14037b1 38911: 270a202d1785a666dee95f7a2fc3552880a8621f v: v3 --- [refs] | 2 +- trunk/fs/xattr.c | 33 +++++++++++++++++++++------------ trunk/include/linux/xattr.h | 1 + 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 06cfcd39dab8..e8725ccd2ce5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e069d79d23739977800c3b8495853b735f77ef30 +refs/heads/master: 659564c8adfe1765476beee8d55cd18986946892 diff --git a/trunk/fs/xattr.c b/trunk/fs/xattr.c index c32f15b5f60f..395635100f77 100644 --- a/trunk/fs/xattr.c +++ b/trunk/fs/xattr.c @@ -135,6 +135,26 @@ vfs_getxattr(struct dentry *dentry, char *name, void *value, size_t size) } EXPORT_SYMBOL_GPL(vfs_getxattr); +ssize_t +vfs_listxattr(struct dentry *d, char *list, size_t size) +{ + ssize_t error; + + error = security_inode_listxattr(d); + if (error) + return error; + error = -EOPNOTSUPP; + if (d->d_inode->i_op && d->d_inode->i_op->listxattr) { + error = d->d_inode->i_op->listxattr(d, list, size); + } else { + error = security_inode_listsecurity(d->d_inode, list, size); + if (size && error > size) + error = -ERANGE; + } + return error; +} +EXPORT_SYMBOL_GPL(vfs_listxattr); + int vfs_removexattr(struct dentry *dentry, char *name) { @@ -346,17 +366,7 @@ listxattr(struct dentry *d, char __user *list, size_t size) return -ENOMEM; } - error = security_inode_listxattr(d); - if (error) - goto out; - error = -EOPNOTSUPP; - if (d->d_inode->i_op && d->d_inode->i_op->listxattr) { - error = d->d_inode->i_op->listxattr(d, klist, size); - } else { - error = security_inode_listsecurity(d->d_inode, klist, size); - if (size && error > size) - error = -ERANGE; - } + error = vfs_listxattr(d, klist, size); if (error > 0) { if (size && copy_to_user(list, klist, error)) error = -EFAULT; @@ -365,7 +375,6 @@ listxattr(struct dentry *d, char __user *list, size_t size) than XATTR_LIST_MAX bytes. Not possible. */ error = -E2BIG; } -out: kfree(klist); return error; } diff --git a/trunk/include/linux/xattr.h b/trunk/include/linux/xattr.h index cda8a96e2fa0..0e7f1e20ea45 100644 --- a/trunk/include/linux/xattr.h +++ b/trunk/include/linux/xattr.h @@ -41,6 +41,7 @@ struct xattr_handler { }; ssize_t vfs_getxattr(struct dentry *, char *, void *, size_t); +ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); int vfs_setxattr(struct dentry *, char *, void *, size_t, int); int vfs_removexattr(struct dentry *, char *);