diff options
Diffstat (limited to 'fs/jffs2/xattr.c')
-rw-r--r-- | fs/jffs2/xattr.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/fs/jffs2/xattr.c b/fs/jffs2/xattr.c index 4c2c03663533..da3e18503c65 100644 --- a/fs/jffs2/xattr.c +++ b/fs/jffs2/xattr.c | |||
@@ -967,7 +967,8 @@ ssize_t jffs2_listxattr(struct dentry *dentry, char *buffer, size_t size) | |||
967 | struct jffs2_xattr_ref *ref, **pref; | 967 | struct jffs2_xattr_ref *ref, **pref; |
968 | struct jffs2_xattr_datum *xd; | 968 | struct jffs2_xattr_datum *xd; |
969 | const struct xattr_handler *xhandle; | 969 | const struct xattr_handler *xhandle; |
970 | ssize_t len, rc; | 970 | const char *prefix; |
971 | ssize_t prefix_len, len, rc; | ||
971 | int retry = 0; | 972 | int retry = 0; |
972 | 973 | ||
973 | rc = check_xattr_ref_inode(c, ic); | 974 | rc = check_xattr_ref_inode(c, ic); |
@@ -998,18 +999,23 @@ ssize_t jffs2_listxattr(struct dentry *dentry, char *buffer, size_t size) | |||
998 | } | 999 | } |
999 | } | 1000 | } |
1000 | xhandle = xprefix_to_handler(xd->xprefix); | 1001 | xhandle = xprefix_to_handler(xd->xprefix); |
1001 | if (!xhandle) | 1002 | if (!xhandle || (xhandle->list && !xhandle->list(dentry))) |
1002 | continue; | 1003 | continue; |
1004 | prefix = xhandle->prefix ?: xhandle->name; | ||
1005 | prefix_len = strlen(prefix); | ||
1006 | rc = prefix_len + xd->name_len + 1; | ||
1007 | |||
1003 | if (buffer) { | 1008 | if (buffer) { |
1004 | rc = xhandle->list(xhandle, dentry, buffer + len, | 1009 | if (rc > size - len) { |
1005 | size - len, xd->xname, | 1010 | rc = -ERANGE; |
1006 | xd->name_len); | 1011 | goto out; |
1007 | } else { | 1012 | } |
1008 | rc = xhandle->list(xhandle, dentry, NULL, 0, | 1013 | memcpy(buffer, prefix, prefix_len); |
1009 | xd->xname, xd->name_len); | 1014 | buffer += prefix_len; |
1015 | memcpy(buffer, xd->xname, xd->name_len); | ||
1016 | buffer += xd->name_len; | ||
1017 | *buffer++ = 0; | ||
1010 | } | 1018 | } |
1011 | if (rc < 0) | ||
1012 | goto out; | ||
1013 | len += rc; | 1019 | len += rc; |
1014 | } | 1020 | } |
1015 | rc = len; | 1021 | rc = len; |