OSDN Git Service

SUNRPC: Hoist init_decode out of svc_authenticate()
authorChuck Lever <chuck.lever@oracle.com>
Mon, 2 Jan 2023 17:07:32 +0000 (12:07 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 20 Feb 2023 14:20:19 +0000 (09:20 -0500)
Now that each ->accept method has been converted to use xdr_stream,
the svcxdr_init_decode() calls can be hoisted back up into the
generic RPC server code.

The dprintk in svc_authenticate() is removed, since
trace_svc_authenticate() reports the same information.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
net/sunrpc/auth_gss/svcauth_gss.c
net/sunrpc/svc.c
net/sunrpc/svcauth.c
net/sunrpc/svcauth_unix.c

index f6d62e3..b3a6717 100644 (file)
@@ -1619,8 +1619,6 @@ svcauth_gss_accept(struct svc_rqst *rqstp)
        int             ret;
        struct sunrpc_net *sn = net_generic(SVC_NET(rqstp), sunrpc_net_id);
 
-       svcxdr_init_decode(rqstp);
-
        rqstp->rq_auth_stat = rpc_autherr_badcred;
        if (!svcdata)
                svcdata = kmalloc(sizeof(*svcdata), GFP_KERNEL);
index f066228..acac00b 100644 (file)
@@ -1276,6 +1276,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
         * We do this before anything else in order to get a decent
         * auth verifier.
         */
+       svcxdr_init_decode(rqstp);
        auth_res = svc_authenticate(rqstp);
        /* Also give the program a chance to reject this call: */
        if (auth_res == SVC_OK && progp)
index e72ba2f..67d8245 100644 (file)
@@ -63,14 +63,17 @@ svc_put_auth_ops(struct auth_ops *aops)
 int
 svc_authenticate(struct svc_rqst *rqstp)
 {
-       rpc_authflavor_t        flavor;
-       struct auth_ops         *aops;
+       struct auth_ops *aops;
+       u32 flavor;
 
        rqstp->rq_auth_stat = rpc_auth_ok;
 
-       flavor = svc_getnl(&rqstp->rq_arg.head[0]);
-
-       dprintk("svc: svc_authenticate (%d)\n", flavor);
+       /*
+        * Decode the Call credential's flavor field. The credential's
+        * body field is decoded in the chosen ->accept method below.
+        */
+       if (xdr_stream_decode_u32(&rqstp->rq_arg_stream, &flavor) < 0)
+               return SVC_GARBAGE;
 
        aops = svc_get_auth_ops(flavor);
        if (aops == NULL) {
index 168e121..f09a148 100644 (file)
@@ -750,8 +750,6 @@ svcauth_null_accept(struct svc_rqst *rqstp)
        u32 flavor, len;
        void *body;
 
-       svcxdr_init_decode(rqstp);
-
        /* Length of Call's credential body field: */
        if (xdr_stream_decode_u32(xdr, &len) < 0)
                return SVC_GARBAGE;
@@ -828,8 +826,6 @@ svcauth_tls_accept(struct svc_rqst *rqstp)
        u32 flavor, len;
        void *body;
 
-       svcxdr_init_decode(rqstp);
-
        /* Length of Call's credential body field: */
        if (xdr_stream_decode_u32(xdr, &len) < 0)
                return SVC_GARBAGE;
@@ -905,8 +901,6 @@ svcauth_unix_accept(struct svc_rqst *rqstp)
        void *body;
        __be32 *p;
 
-       svcxdr_init_decode(rqstp);
-
        /*
         * This implementation ignores the length of the Call's
         * credential body field and the timestamp and machinename