mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 08:15:07 -04:00
nfsd: check nfsd4_acl_to_attr() return value in nfsd4_create()
nfsd4_create() stores the return value of nfsd4_acl_to_attr() in
status, but the switch(create->cr_type) block unconditionally
overwrites it in every branch. ACL translation errors are silently
discarded, and the CREATE proceeds without the requested ACL.
Add an early exit check after nfsd4_acl_to_attr(), matching the
pattern already used in nfsd4_setattr().
Fixes: c0cbe70742 ("NFSD: add posix ACLs to struct nfsd_attrs")
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Jeff Layton <jlayton@kernel.org>
[ cel: prefer NFS4ERR_BADTYPE over NFS4ERR_ATTRNOTSUPP ]
Link: https://patch.msgid.link/20260611-nfsd-testing-v2-5-5b90e276f2d9@kernel.org
Signed-off-by: Chuck Lever <cel@kernel.org>
This commit is contained in:
@@ -848,6 +848,20 @@ nfsd4_create(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||
if (status)
|
||||
goto out_aftermask;
|
||||
|
||||
/* Sanitize cr_type to avoid returning ATTRNOTSUPP. */
|
||||
switch (create->cr_type) {
|
||||
case NF4LNK:
|
||||
case NF4BLK:
|
||||
case NF4CHR:
|
||||
case NF4SOCK:
|
||||
case NF4FIFO:
|
||||
case NF4DIR:
|
||||
break;
|
||||
default:
|
||||
status = nfserr_badtype;
|
||||
goto out_aftermask;
|
||||
}
|
||||
|
||||
if (create->cr_acl) {
|
||||
if (attrs.na_dpacl || attrs.na_pacl) {
|
||||
status = nfserr_inval;
|
||||
@@ -855,6 +869,8 @@ nfsd4_create(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||
}
|
||||
status = nfsd4_acl_to_attr(create->cr_type, create->cr_acl,
|
||||
&attrs);
|
||||
if (status != nfs_ok)
|
||||
goto out_aftermask;
|
||||
}
|
||||
current->fs->umask = create->cr_umask;
|
||||
switch (create->cr_type) {
|
||||
|
||||
Reference in New Issue
Block a user