From patchwork Fri Jun 18 04:20:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gao Xiang X-Patchwork-Id: 12330067 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98C5CC48BE8 for ; Fri, 18 Jun 2021 04:21:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 664EC61139 for ; Fri, 18 Jun 2021 04:21:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230419AbhFREXe (ORCPT ); Fri, 18 Jun 2021 00:23:34 -0400 Received: from out30-42.freemail.mail.aliyun.com ([115.124.30.42]:43364 "EHLO out30-42.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229522AbhFREXd (ORCPT ); Fri, 18 Jun 2021 00:23:33 -0400 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R131e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04394;MF=hsiangkao@linux.alibaba.com;NM=1;PH=DS;RN=7;SR=0;TI=SMTPD_---0Ucn0dZ0_1623990056; Received: from e18g09479.et15sqa.tbsite.net(mailfrom:hsiangkao@linux.alibaba.com fp:SMTPD_---0Ucn0dZ0_1623990056) by smtp.aliyun-inc.com(127.0.0.1); Fri, 18 Jun 2021 12:21:23 +0800 From: Gao Xiang To: linux-nfs@vger.kernel.org Cc: LKML , Gao Xiang , Trond Myklebust , Anna Schumaker , Christoph Hellwig , Joseph Qi Subject: [PATCH] nfs: fix acl memory leak of posix_acl_create() Date: Fri, 18 Jun 2021 12:20:55 +0800 Message-Id: <1623990055-222609-1-git-send-email-hsiangkao@linux.alibaba.com> X-Mailer: git-send-email 1.8.3.1 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org When looking into another nfs xfstests report, I found acl and default_acl in nfs3_proc_create() and nfs3_proc_mknod() error paths are possibly leaked. Fix them in advance. Fixes: 013cdf1088d7 ("nfs: use generic posix ACL infrastructure for v3 Posix ACLs") Cc: Trond Myklebust Cc: Anna Schumaker Cc: Christoph Hellwig Cc: Joseph Qi Signed-off-by: Gao Xiang --- If I read correctly.. fs/nfs/nfs3proc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index 5c4e23abc345..2299446b3b89 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c @@ -385,7 +385,7 @@ static void nfs3_free_createdata(struct nfs3_createdata *data) break; case NFS3_CREATE_UNCHECKED: - goto out; + goto out_release_acls; } nfs_fattr_init(data->res.dir_attr); nfs_fattr_init(data->res.fattr); @@ -751,7 +751,7 @@ static int nfs3_proc_readdir(struct nfs_readdir_arg *nr_arg, break; default: status = -EINVAL; - goto out; + goto out_release_acls; } d_alias = nfs3_do_create(dir, dentry, data); From patchwork Fri Jun 18 09:12:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gao Xiang X-Patchwork-Id: 12330713 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B9D0BC48BDF for ; Fri, 18 Jun 2021 09:12:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9FE7460FD8 for ; Fri, 18 Jun 2021 09:12:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233214AbhFRJPB (ORCPT ); Fri, 18 Jun 2021 05:15:01 -0400 Received: from out30-132.freemail.mail.aliyun.com ([115.124.30.132]:57989 "EHLO out30-132.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234074AbhFRJOo (ORCPT ); Fri, 18 Jun 2021 05:14:44 -0400 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R351e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04420;MF=hsiangkao@linux.alibaba.com;NM=1;PH=DS;RN=6;SR=0;TI=SMTPD_---0UcohVPl_1624007547; Received: from e18g09479.et15sqa.tbsite.net(mailfrom:hsiangkao@linux.alibaba.com fp:SMTPD_---0UcohVPl_1624007547) by smtp.aliyun-inc.com(127.0.0.1); Fri, 18 Jun 2021 17:12:34 +0800 From: Gao Xiang To: linux-nfs@vger.kernel.org Cc: LKML , Gao Xiang , Trond Myklebust , Anna Schumaker , Joseph Qi Subject: [RFC PATCH 2/1] nfs: NFSv3: fix SGID bit dropped when inheriting ACLs Date: Fri, 18 Jun 2021 17:12:25 +0800 Message-Id: <1624007545-142045-1-git-send-email-hsiangkao@linux.alibaba.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1623990055-222609-1-git-send-email-hsiangkao@linux.alibaba.com> References: <1623990055-222609-1-git-send-email-hsiangkao@linux.alibaba.com> Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org generic/444 fails with NFSv3 as shown above, " QA output created by 444 drwxrwsr-x -drwxrwsr-x +drwxrwxr-x ", which tests "SGID inheritance with default ACLs" fs regression and looks after the following commits: a3bb2d558752 ("ext4: Don't clear SGID when inheriting ACLs") 073931017b49 ("posix_acl: Clear SGID bit when setting file permissions") commit 055ffbea0596 ("[PATCH] NFS: Fix handling of the umask when an NFSv3 default acl is present.") sets acls explicitly when when files are created in a directory that has a default ACL. However, after commit a3bb2d558752 and 073931017b49, SGID can be dropped if user is not member of the owning group with set_posix_acl() called. Since underlayfs will handle ACL inheritance when creating files in a directory that has the default ACL and the umask is supposed to be ignored for such case. Therefore, I think no need to set acls explicitly (to avoid SGID bit cleared) but only apply client umask if the default ACL of the parent directory doesn't exist. With this patch, generic/444 can pass now. Cc: Trond Myklebust Cc: Anna Schumaker Cc: Joseph Qi Signed-off-by: Gao Xiang --- I didn't find the original discussion with Buck Huppmann about this topic mentioned in https://lore.kernel.org/r/20050122203620.108564000@blunzn.suse.de/ and it's just a rough thought about this issue... fs/nfs/nfs3proc.c | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index 2299446b3b89..a5676be676be 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c @@ -339,7 +339,7 @@ static void nfs3_free_createdata(struct nfs3_createdata *data) nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, int flags) { - struct posix_acl *default_acl, *acl; + struct posix_acl *pacl; struct nfs3_createdata *data; struct dentry *d_alias; int status = -ENOMEM; @@ -350,6 +350,10 @@ static void nfs3_free_createdata(struct nfs3_createdata *data) if (data == NULL) goto out; + pacl = get_acl(dir, ACL_TYPE_DEFAULT); + if (!pacl || pacl == ERR_PTR(-EOPNOTSUPP)) + sattr->ia_mode &= ~current_umask(); + data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_CREATE]; data->arg.create.fh = NFS_FH(dir); data->arg.create.name = dentry->d_name.name; @@ -363,10 +367,6 @@ static void nfs3_free_createdata(struct nfs3_createdata *data) data->arg.create.verifier[1] = cpu_to_be32(current->pid); } - status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl); - if (status) - goto out; - for (;;) { d_alias = nfs3_do_create(dir, dentry, data); status = PTR_ERR_OR_ZERO(d_alias); @@ -416,14 +416,10 @@ static void nfs3_free_createdata(struct nfs3_createdata *data) if (status != 0) goto out_dput; } - - status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl); - out_dput: dput(d_alias); out_release_acls: - posix_acl_release(acl); - posix_acl_release(default_acl); + posix_acl_release(pacl); out: nfs3_free_createdata(data); dprintk("NFS reply create: %d\n", status); @@ -582,7 +578,7 @@ static void nfs3_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renam static int nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr) { - struct posix_acl *default_acl, *acl; + struct posix_acl *pacl; struct nfs3_createdata *data; struct dentry *d_alias; int status = -ENOMEM; @@ -593,10 +589,9 @@ static void nfs3_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renam if (data == NULL) goto out; - status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl); - if (status) - goto out; - + pacl = get_acl(dir, ACL_TYPE_DEFAULT); + if (!pacl || pacl == ERR_PTR(-EOPNOTSUPP)) + sattr->ia_mode &= ~current_umask(); data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKDIR]; data->arg.mkdir.fh = NFS_FH(dir); data->arg.mkdir.name = dentry->d_name.name; @@ -612,12 +607,9 @@ static void nfs3_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renam if (d_alias) dentry = d_alias; - status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl); - dput(d_alias); out_release_acls: - posix_acl_release(acl); - posix_acl_release(default_acl); + posix_acl_release(pacl); out: nfs3_free_createdata(data); dprintk("NFS reply mkdir: %d\n", status); @@ -713,7 +705,7 @@ static int nfs3_proc_readdir(struct nfs_readdir_arg *nr_arg, nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr, dev_t rdev) { - struct posix_acl *default_acl, *acl; + struct posix_acl *pacl; struct nfs3_createdata *data; struct dentry *d_alias; int status = -ENOMEM; @@ -725,9 +717,9 @@ static int nfs3_proc_readdir(struct nfs_readdir_arg *nr_arg, if (data == NULL) goto out; - status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl); - if (status) - goto out; + pacl = get_acl(dir, ACL_TYPE_DEFAULT); + if (!pacl || pacl == ERR_PTR(-EOPNOTSUPP)) + sattr->ia_mode &= ~current_umask(); data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKNOD]; data->arg.mknod.fh = NFS_FH(dir); @@ -762,12 +754,9 @@ static int nfs3_proc_readdir(struct nfs_readdir_arg *nr_arg, if (d_alias) dentry = d_alias; - status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl); - dput(d_alias); out_release_acls: - posix_acl_release(acl); - posix_acl_release(default_acl); + posix_acl_release(pacl); out: nfs3_free_createdata(data); dprintk("NFS reply mknod: %d\n", status);