summaryrefslogtreecommitdiffstats
path: root/net/sunrpc
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-03-03 01:22:27 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-03-03 01:22:27 +0000
commitf9bbe9da79dbc8557c74efeb158b431cd67ace52 (patch)
tree3220d014a35f9d88a48668a1468524e988daebff /net/sunrpc
parent3d697109c1ff85ef563aec3d5e113ef225ed2792 (diff)
Upgrade to 2.1.73.
Diffstat (limited to 'net/sunrpc')
-rw-r--r--net/sunrpc/svc.c126
1 files changed, 69 insertions, 57 deletions
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 731072fe5..79882845c 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -21,6 +21,7 @@
#include <linux/sunrpc/clnt.h>
#define RPCDBG_FACILITY RPCDBG_SVCDSP
+#define RPC_PARANOIA 1
/*
* Create an RPC service
@@ -162,8 +163,9 @@ svc_exit_thread(struct svc_rqst *rqstp)
}
/*
- * Register an RPC service with the local portmapper. To
- * unregister a service, call this routine with proto and port == 0.
+ * Register an RPC service with the local portmapper.
+ * To unregister a service, call this routine with
+ * proto and port == 0.
*/
int
svc_register(struct svc_serv *serv, int proto, unsigned short port)
@@ -196,7 +198,7 @@ svc_register(struct svc_serv *serv, int proto, unsigned short port)
continue;
error = rpc_register(progp->pg_prog, i, proto, port, &dummy);
if (error < 0)
- return error;
+ break;
if (port && !dummy) {
error = -EACCES;
break;
@@ -246,14 +248,8 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
serv->sv_stats->rpcbadfmt++;
goto dropit; /* drop request */
}
- if (vers != 2) { /* RPC version number */
- serv->sv_stats->rpcbadfmt++;
- resp->buf[-1] = xdr_one; /* REJECT */
- svc_putlong(resp, xdr_zero); /* RPC_MISMATCH */
- svc_putlong(resp, xdr_two); /* Only RPCv2 supported */
- svc_putlong(resp, xdr_two);
- goto error;
- }
+ if (vers != 2) /* RPC version number */
+ goto err_bad_rpc;
rqstp->rq_prog = prog = ntohl(*bufp++); /* program number */
rqstp->rq_vers = vers = ntohl(*bufp++); /* version number */
@@ -269,50 +265,23 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
*/
svc_authenticate(rqstp, &rpc_stat, &auth_stat);
- if (rpc_stat != rpc_success) {
- serv->sv_stats->rpcbadfmt++;
- svc_putlong(resp, rpc_garbage_args);
- goto error;
- }
+ if (rpc_stat != rpc_success)
+ goto err_garbage;
- if (auth_stat != rpc_auth_ok) {
- dprintk("svc: authentication failed (%ld)\n", ntohl(auth_stat));
- serv->sv_stats->rpcbadauth++;
- resp->buf[-1] = xdr_one; /* REJECT */
- svc_putlong(resp, xdr_one); /* AUTH_ERROR */
- svc_putlong(resp, auth_stat); /* status */
- goto error;
- return svc_send(rqstp);
- }
+ if (auth_stat != rpc_auth_ok)
+ goto err_bad_auth;
progp = serv->sv_program;
- if (prog != progp->pg_prog) {
- dprintk("svc: unknown program %d (me %d)\n", prog, progp->pg_prog);
- serv->sv_stats->rpcbadfmt++;
- svc_putlong(resp, rpc_prog_unavail);
- goto error;
- return svc_send(rqstp);
- }
+ if (prog != progp->pg_prog)
+ goto err_bad_prog;
versp = progp->pg_vers[vers];
- if (!versp || vers >= progp->pg_nvers) {
- dprintk("svc: unknown version (%d)\n", vers);
- serv->sv_stats->rpcbadfmt++;
- svc_putlong(resp, rpc_prog_mismatch);
- svc_putlong(resp, htonl(progp->pg_lovers));
- svc_putlong(resp, htonl(progp->pg_hivers));
- goto error;
- return svc_send(rqstp);
- }
+ if (!versp || vers >= progp->pg_nvers)
+ goto err_bad_vers;
procp = versp->vs_proc + proc;
- if (proc >= versp->vs_nproc || !procp->pc_func) {
- dprintk("svc: unknown procedure (%d)\n", proc);
- serv->sv_stats->rpcbadfmt++;
- svc_putlong(resp, rpc_proc_unavail);
- goto error;
- return svc_send(rqstp);
- }
+ if (proc >= versp->vs_nproc || !procp->pc_func)
+ goto err_unknown;
rqstp->rq_server = serv;
rqstp->rq_procinfo = procp;
@@ -334,16 +303,10 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
if (!versp->vs_dispatch) {
/* Decode arguments */
xdr = procp->pc_decode;
- if (xdr && !xdr(rqstp, rqstp->rq_argbuf.buf, rqstp->rq_argp)) {
- dprintk("svc: failed to decode args\n");
- serv->sv_stats->rpcbadfmt++;
- svc_putlong(resp, rpc_garbage_args);
- goto error;
- }
+ if (xdr && !xdr(rqstp, rqstp->rq_argbuf.buf, rqstp->rq_argp))
+ goto err_garbage;
- *statp = procp->pc_func(rqstp,
- rqstp->rq_argp,
- rqstp->rq_resp);
+ *statp = procp->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
/* Encode reply */
if (*statp == rpc_success && (xdr = procp->pc_encode)
@@ -374,6 +337,55 @@ dropit:
svc_drop(rqstp);
return 0;
+err_bad_rpc:
+ serv->sv_stats->rpcbadfmt++;
+ resp->buf[-1] = xdr_one; /* REJECT */
+ svc_putlong(resp, xdr_zero); /* RPC_MISMATCH */
+ svc_putlong(resp, xdr_two); /* Only RPCv2 supported */
+ svc_putlong(resp, xdr_two);
+ goto error;
+
+err_bad_auth:
+ dprintk("svc: authentication failed (%ld)\n", ntohl(auth_stat));
+ serv->sv_stats->rpcbadauth++;
+ resp->buf[-1] = xdr_one; /* REJECT */
+ svc_putlong(resp, xdr_one); /* AUTH_ERROR */
+ svc_putlong(resp, auth_stat); /* status */
+ goto error;
+
+err_bad_prog:
+#ifdef RPC_PARANOIA
+ printk("svc: unknown program %d (me %d)\n", prog, progp->pg_prog);
+#endif
+ serv->sv_stats->rpcbadfmt++;
+ svc_putlong(resp, rpc_prog_unavail);
+ goto error;
+
+err_bad_vers:
+#ifdef RPC_PARANOIA
+ printk("svc: unknown version (%d)\n", vers);
+#endif
+ serv->sv_stats->rpcbadfmt++;
+ svc_putlong(resp, rpc_prog_mismatch);
+ svc_putlong(resp, htonl(progp->pg_lovers));
+ svc_putlong(resp, htonl(progp->pg_hivers));
+ goto error;
+
+err_unknown:
+#ifdef RPC_PARANOIA
+ printk("svc: unknown procedure (%d)\n", proc);
+#endif
+ serv->sv_stats->rpcbadfmt++;
+ svc_putlong(resp, rpc_proc_unavail);
+ goto error;
+
+err_garbage:
+#ifdef RPC_PARANOIA
+ printk("svc: failed to decode args\n");
+#endif
+ serv->sv_stats->rpcbadfmt++;
+ svc_putlong(resp, rpc_garbage_args);
+
error:
return svc_send(rqstp);
}