57 lines
1.8 KiB
Diff
57 lines
1.8 KiB
Diff
|
From: "J. Bruce Fields" <bfields@redhat.com>
|
||
|
Date: Tue, 16 Jun 2020 16:43:18 -0400
|
||
|
Subject: nfsd: apply umask on fs without ACL support
|
||
|
Origin: http://git.linux-nfs.org/?p=bfields/linux.git;a=commit;h=22cf8419f1319ff87ec759d0ebdff4cbafaee832
|
||
|
Bug-Debian: https://bugs.debian.org/962254
|
||
|
|
||
|
The server is failing to apply the umask when creating new objects on
|
||
|
filesystems without ACL support.
|
||
|
|
||
|
To reproduce this, you need to use NFSv4.2 and a client and server
|
||
|
recent enough to support umask, and you need to export a filesystem that
|
||
|
lacks ACL support (for example, ext4 with the "noacl" mount option).
|
||
|
|
||
|
Filesystems with ACL support are expected to take care of the umask
|
||
|
themselves (usually by calling posix_acl_create).
|
||
|
|
||
|
For filesystems without ACL support, this is up to the caller of
|
||
|
vfs_create(), vfs_mknod(), or vfs_mkdir().
|
||
|
|
||
|
Reported-by: Elliott Mitchell <ehem+debian@m5p.com>
|
||
|
Reported-by: Salvatore Bonaccorso <carnil@debian.org>
|
||
|
Tested-by: Salvatore Bonaccorso <carnil@debian.org>
|
||
|
Fixes: 47057abde515 ("nfsd: add support for the umask attribute")
|
||
|
Cc: stable@vger.kernel.org
|
||
|
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
|
||
|
---
|
||
|
fs/nfsd/vfs.c | 6 ++++++
|
||
|
1 file changed, 6 insertions(+)
|
||
|
|
||
|
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
|
||
|
index c3fbab1753ec..d22a056da477 100644
|
||
|
--- a/fs/nfsd/vfs.c
|
||
|
+++ b/fs/nfsd/vfs.c
|
||
|
@@ -1226,6 +1226,9 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||
|
iap->ia_mode = 0;
|
||
|
iap->ia_mode = (iap->ia_mode & S_IALLUGO) | type;
|
||
|
|
||
|
+ if (!IS_POSIXACL(dirp))
|
||
|
+ iap->ia_mode &= ~current_umask();
|
||
|
+
|
||
|
err = 0;
|
||
|
host_err = 0;
|
||
|
switch (type) {
|
||
|
@@ -1458,6 +1461,9 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
+ if (!IS_POSIXACL(dirp))
|
||
|
+ iap->ia_mode &= ~current_umask();
|
||
|
+
|
||
|
host_err = vfs_create(dirp, dchild, iap->ia_mode, true);
|
||
|
if (host_err < 0) {
|
||
|
fh_drop_write(fhp);
|
||
|
--
|
||
|
2.27.0
|
||
|
|