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

Commit 80d188a6 authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds
Browse files

[PATCH] knfsd: make sure svc_process call the correct pg_authenticate for multi-service port



If an RPC socket is serving multiple programs, then the pg_authenticate of
the first program in the list is called, instead of pg_authenticate for the
program to be run.

This does not cause a problem with any programs in the current kernel, but
could confuse future code.

Also set pg_authenticate for nfsd_acl_program incase it ever gets used.

Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0ba7536d
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -427,6 +427,7 @@ static struct svc_program nfsd_acl_program = {
	.pg_name		= "nfsd",
	.pg_name		= "nfsd",
	.pg_class		= "nfsd",
	.pg_class		= "nfsd",
	.pg_stats		= &nfsd_acl_svcstats,
	.pg_stats		= &nfsd_acl_svcstats,
	.pg_authenticate	= &svc_set_client,
};
};


static struct svc_stat	nfsd_acl_svcstats = {
static struct svc_stat	nfsd_acl_svcstats = {
+7 −5
Original line number Original line Diff line number Diff line
@@ -313,6 +313,11 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
	rqstp->rq_proc = proc = ntohl(svc_getu32(argv));	/* procedure number */
	rqstp->rq_proc = proc = ntohl(svc_getu32(argv));	/* procedure number */


	progp = serv->sv_program;
	progp = serv->sv_program;

	for (progp = serv->sv_program; progp; progp = progp->pg_next)
		if (prog == progp->pg_prog)
			break;

	/*
	/*
	 * Decode auth data, and add verifier to reply buffer.
	 * Decode auth data, and add verifier to reply buffer.
	 * We do this before anything else in order to get a decent
	 * We do this before anything else in order to get a decent
@@ -320,7 +325,7 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
	 */
	 */
	auth_res = svc_authenticate(rqstp, &auth_stat);
	auth_res = svc_authenticate(rqstp, &auth_stat);
	/* Also give the program a chance to reject this call: */
	/* Also give the program a chance to reject this call: */
	if (auth_res == SVC_OK) {
	if (auth_res == SVC_OK && progp) {
		auth_stat = rpc_autherr_badcred;
		auth_stat = rpc_autherr_badcred;
		auth_res = progp->pg_authenticate(rqstp);
		auth_res = progp->pg_authenticate(rqstp);
	}
	}
@@ -341,9 +346,6 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
		goto sendit;
		goto sendit;
	}
	}


	for (progp = serv->sv_program; progp; progp = progp->pg_next)
		if (prog == progp->pg_prog)
			break;
	if (progp == NULL)
	if (progp == NULL)
		goto err_bad_prog;
		goto err_bad_prog;