From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755367AbbLKQJa (ORCPT ); Fri, 11 Dec 2015 11:09:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:38895 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755323AbbLKQJ2 (ORCPT ); Fri, 11 Dec 2015 11:09:28 -0500 From: Andreas Gruenbacher To: Al Viro Cc: Andreas Gruenbacher , LKML , linux-fsdevel Subject: Re: [PATCH] nfs: Fix listxattr regression (2) Date: Fri, 11 Dec 2015 17:09:23 +0100 Message-Id: <1449850163-20050-1-git-send-email-agruenba@redhat.com> References: <1449836146-5674-1-git-send-email-agruenba@redhat.com> <20151211125528.GJ20997@ZenIV.linux.org.uk> <1449846859-19375-1-git-send-email-agruenba@redhat.com> In-Reply-To: <1449846859-19375-1-git-send-email-agruenba@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Dec 11, 2015 at 4:14 PM, Andreas Gruenbacher wrote: > Al, > > here is another fix for the same botched nfs commit. Could you please > also merge / fold that? Sorry for the mess. I've pushed a branch with those two fixes here: git://git.kernel.org/pub/scm/linux/kernel/git/agruen/linux xattr-wip2 This is your work.xattr branch with the fixes folded in and with your Signed-off-by tags removed from the two commits that have been modified: nfs: Move call to security_inode_listsecurity into nfs_listxattr xattr handlers: Simplify list operation Diff between work.xattr and xattr-wip2 below. Thanks, Andreas diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index e9db118..c57d133 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -6296,8 +6296,8 @@ nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len) int len = 0; if (nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) { - len = security_inode_listsecurity(inode, list, len); - if (len > list_len) + len = security_inode_listsecurity(inode, list, list_len); + if (list_len && len > list_len) return -ERANGE; } return len; diff --git a/fs/xattr.c b/fs/xattr.c index bfd4a85..d7f5037 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -723,21 +723,23 @@ generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size) if (!buffer) { for_each_xattr_handler(handlers, handler) { - if (handler->list(dentry)) - size += strlen(handler->name) + 1; + if (!handler->name || + (handler->list && !handler->list(dentry))) + continue; + size += strlen(handler->name) + 1; } } else { char *buf = buffer; size_t len; for_each_xattr_handler(handlers, handler) { - if (!handler->list(dentry)) + if (!handler->name || + (handler->list && !handler->list(dentry))) continue; len = strlen(handler->name); if (len + 1 > buffer_size) return -ERANGE; - memcpy(buf, handler->name, len); - buf[len] = 0; + memcpy(buf, handler->name, len + 1); buf += len + 1; buffer_size -= len + 1; }