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

Commit efe39651 authored by Al Viro's avatar Al Viro
Browse files

nfsd: fix compose_entry_fh() failure exits



Restore the original logics ("fail on mountpoints, negatives and in
case of fh_compose() failures").  Since commit 8177e (nfsd: clean up
readdirplus encoding) that got broken -
	rv = fh_compose(fhp, exp, dchild, &cd->fh);
	if (rv)
	       goto out;
	if (!dchild->d_inode)
		goto out;
	rv = 0;
out:
is equivalent to
	rv = fh_compose(fhp, exp, dchild, &cd->fh);
out:
and the second check has no effect whatsoever...

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent afcf6792
Loading
Loading
Loading
Loading
+8 −14
Original line number Diff line number Diff line
@@ -803,13 +803,13 @@ encode_entry_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name,
	return p;
}

static int
static __be32
compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
		const char *name, int namlen)
{
	struct svc_export	*exp;
	struct dentry		*dparent, *dchild;
	int rv = 0;
	__be32 rv = nfserr_noent;

	dparent = cd->fh.fh_dentry;
	exp  = cd->fh.fh_export;
@@ -817,26 +817,20 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
	if (isdotent(name, namlen)) {
		if (namlen == 2) {
			dchild = dget_parent(dparent);
			if (dchild == dparent) {
			/* filesystem root - cannot return filehandle for ".." */
				dput(dchild);
				return -ENOENT;
			}
			if (dchild == dparent)
				goto out;
		} else
			dchild = dget(dparent);
	} else
		dchild = lookup_one_len(name, dparent, namlen);
	if (IS_ERR(dchild))
		return -ENOENT;
	rv = -ENOENT;
		return rv;
	if (d_mountpoint(dchild))
		goto out;
	rv = fh_compose(fhp, exp, dchild, &cd->fh);
	if (rv)
		goto out;
	if (!dchild->d_inode)
		goto out;
	rv = 0;
	rv = fh_compose(fhp, exp, dchild, &cd->fh);
out:
	dput(dchild);
	return rv;
@@ -845,7 +839,7 @@ out:
static __be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen)
{
	struct svc_fh	fh;
	int err;
	__be32 err;

	fh_init(&fh, NFS3_FHSIZE);
	err = compose_entry_fh(cd, &fh, name, namlen);