Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f926b5b authored by Trond Myklebust's avatar Trond Myklebust
Browse files

[NFS]: Check that the server returns a valid regular file to our OPEN request



 Since it appears that some servers don't...

 Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 02a913a7
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -957,10 +957,12 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
				res = NULL;
				goto out;
			/* This turned out not to be a regular file */
			case -EISDIR:
			case -ENOTDIR:
				goto no_open;
			case -ELOOP:
				if (!(nd->intent.open.flags & O_NOFOLLOW))
					goto no_open;
			/* case -EISDIR: */
			/* case -EINVAL: */
			default:
				goto out;
+16 −0
Original line number Diff line number Diff line
@@ -419,6 +419,22 @@ static int _nfs4_proc_open(struct inode *dir, struct nfs4_state_owner *sp, stru
	o_arg->clientid = sp->so_client->cl_clientid;

	status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR);
	if (status == 0) {
		/* OPEN on anything except a regular file is disallowed in NFSv4 */
		switch (o_res->f_attr->mode & S_IFMT) {
			case S_IFREG:
				break;
			case S_IFLNK:
				status = -ELOOP;
				break;
			case S_IFDIR:
				status = -EISDIR;
				break;
			default:
				status = -ENOTDIR;
		}
	}

	nfs_increment_open_seqid(status, o_arg->seqid);
	if (status != 0)
		goto out;