mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
NFSD: return NFS4ERR_EXIST for a guarded OPEN of a non-regular object
Commit db8b567ffa98 ("nfsd: (almost) always open file in
nfsd4_create_file()") moved the regular-file type check ahead of the
createmode logic. A GUARDED4, EXCLUSIVE4, or EXCLUSIVE4_1 OPEN that
finds a directory or symbolic link under the requested name now fails
with NFS4ERR_ISDIR or NFS4ERR_SYMLINK instead of NFS4ERR_EXIST.
RFC 8881 Section 18.16.3 requires NFS4ERR_EXIST when a guarded create
finds any object under that name, or when an exclusive create's
verifier does not match. The type-specific errors in Section 18.16.4
apply to opening an existing file, which only UNCHECKED4 does.
Fixes: db8b567ffa98 ("nfsd: (almost) always open file in nfsd4_create_file()")
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260906184141.3453309-1-cel@kernel.org
Signed-off-by: Chuck Lever <cel@kernel.org>
This commit is contained in:
parent
8d7859d165
commit
89318a02fe
|
|
@ -430,7 +430,17 @@ nfsd4_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|||
oflags,
|
||||
open->op_iattr.ia_mode);
|
||||
if (IS_ERR(open->op_filp)) {
|
||||
status = nfserrno(PTR_ERR(open->op_filp));
|
||||
int hosterr = PTR_ERR(open->op_filp);
|
||||
|
||||
if (open->op_createmode != NFS4_CREATE_UNCHECKED) {
|
||||
switch (hosterr) {
|
||||
case -EISDIR:
|
||||
case -ELOOP:
|
||||
case -EFTYPE:
|
||||
hosterr = -EEXIST;
|
||||
}
|
||||
}
|
||||
status = nfserrno(hosterr);
|
||||
open->op_filp = NULL;
|
||||
if (status == nfserr_noent && create_status)
|
||||
status = create_status;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user