diff options
Diffstat (limited to 'fs/reiserfs/xattr.c')
-rw-r--r-- | fs/reiserfs/xattr.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index 66b26fdfff8d..e5ddb4e5ea94 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c | |||
@@ -756,7 +756,8 @@ find_xattr_handler_prefix(const struct xattr_handler **handlers, | |||
756 | return NULL; | 756 | return NULL; |
757 | 757 | ||
758 | for_each_xattr_handler(handlers, xah) { | 758 | for_each_xattr_handler(handlers, xah) { |
759 | if (strncmp(xah->prefix, name, strlen(xah->prefix)) == 0) | 759 | const char *prefix = xattr_prefix(xah); |
760 | if (strncmp(prefix, name, strlen(prefix)) == 0) | ||
760 | break; | 761 | break; |
761 | } | 762 | } |
762 | 763 | ||
@@ -839,19 +840,16 @@ static int listxattr_filler(struct dir_context *ctx, const char *name, | |||
839 | 840 | ||
840 | handler = find_xattr_handler_prefix(b->dentry->d_sb->s_xattr, | 841 | handler = find_xattr_handler_prefix(b->dentry->d_sb->s_xattr, |
841 | name); | 842 | name); |
842 | if (!handler) /* Unsupported xattr name */ | 843 | if (!handler /* Unsupported xattr name */ || |
844 | (handler->list && !handler->list(b->dentry))) | ||
843 | return 0; | 845 | return 0; |
846 | size = namelen + 1; | ||
844 | if (b->buf) { | 847 | if (b->buf) { |
845 | size = handler->list(handler, b->dentry, | ||
846 | b->buf + b->pos, b->size, name, | ||
847 | namelen); | ||
848 | if (size > b->size) | 848 | if (size > b->size) |
849 | return -ERANGE; | 849 | return -ERANGE; |
850 | } else { | 850 | memcpy(b->buf + b->pos, name, namelen); |
851 | size = handler->list(handler, b->dentry, | 851 | b->buf[b->pos + namelen] = 0; |
852 | NULL, 0, name, namelen); | ||
853 | } | 852 | } |
854 | |||
855 | b->pos += size; | 853 | b->pos += size; |
856 | } | 854 | } |
857 | return 0; | 855 | return 0; |