[SUNRPC]: svc_{get,put}nl()
Alexey Dobriyan [Wed, 27 Sep 2006 05:28:46 +0000 (22:28 -0700)]
* add svc_getnl():
Take network-endian value from buffer, convert to host-endian
and return it.
* add svc_putnl():
Take host-endian value, convert to network-endian and put it
into a buffer.
* annotate svc_getu32()/svc_putu32() as dealing with network-endian.
* convert to svc_getnl(), svc_putnl().

[AV: in large part it's a carved-up Alexey's patch]

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>

include/linux/sunrpc/svc.h
net/sunrpc/auth_gss/svcauth_gss.c
net/sunrpc/svc.c
net/sunrpc/svcauth.c
net/sunrpc/svcauth_unix.c

index 7b27c09..5df1d31 100644 (file)
@@ -78,28 +78,45 @@ struct svc_serv {
  */
 #define RPCSVC_MAXPAGES                ((RPCSVC_MAXPAYLOAD+PAGE_SIZE-1)/PAGE_SIZE + 2)
 
-static inline u32 svc_getu32(struct kvec *iov)
+static inline u32 svc_getnl(struct kvec *iov)
 {
-       u32 val, *vp;
+       __be32 val, *vp;
        vp = iov->iov_base;
        val = *vp++;
        iov->iov_base = (void*)vp;
-       iov->iov_len -= sizeof(u32);
+       iov->iov_len -= sizeof(__be32);
+       return ntohl(val);
+}
+
+static inline void svc_putnl(struct kvec *iov, u32 val)
+{
+       __be32 *vp = iov->iov_base + iov->iov_len;
+       *vp = htonl(val);
+       iov->iov_len += sizeof(__be32);
+}
+
+static inline __be32 svc_getu32(struct kvec *iov)
+{
+       __be32 val, *vp;
+       vp = iov->iov_base;
+       val = *vp++;
+       iov->iov_base = (void*)vp;
+       iov->iov_len -= sizeof(__be32);
        return val;
 }
 
 static inline void svc_ungetu32(struct kvec *iov)
 {
-       u32 *vp = (u32 *)iov->iov_base;
+       __be32 *vp = (__be32 *)iov->iov_base;
        iov->iov_base = (void *)(vp - 1);
        iov->iov_len += sizeof(*vp);
 }
 
-static inline void svc_putu32(struct kvec *iov, u32 val)
+static inline void svc_putu32(struct kvec *iov, __be32 val)
 {
-       u32 *vp = iov->iov_base + iov->iov_len;
+       __be32 *vp = iov->iov_base + iov->iov_len;
        *vp = val;
-       iov->iov_len += sizeof(u32);
+       iov->iov_len += sizeof(__be32);
 }
 
        
index 94217ec..cd3d77c 100644 (file)
@@ -607,7 +607,7 @@ svc_safe_getnetobj(struct kvec *argv, struct xdr_netobj *o)
 
        if (argv->iov_len < 4)
                return -1;
-       o->len = ntohl(svc_getu32(argv));
+       o->len = svc_getnl(argv);
        l = round_up_to_quad(o->len);
        if (argv->iov_len < l)
                return -1;
@@ -624,7 +624,7 @@ svc_safe_putnetobj(struct kvec *resv, struct xdr_netobj *o)
 
        if (resv->iov_len + 4 > PAGE_SIZE)
                return -1;
-       svc_putu32(resv, htonl(o->len));
+       svc_putnl(resv, o->len);
        p = resv->iov_base + resv->iov_len;
        resv->iov_len += round_up_to_quad(o->len);
        if (resv->iov_len > PAGE_SIZE)
@@ -657,7 +657,7 @@ gss_verify_header(struct svc_rqst *rqstp, struct rsc *rsci,
        *authp = rpc_autherr_badverf;
        if (argv->iov_len < 4)
                return SVC_DENIED;
-       flavor = ntohl(svc_getu32(argv));
+       flavor = svc_getnl(argv);
        if (flavor != RPC_AUTH_GSS)
                return SVC_DENIED;
        if (svc_safe_getnetobj(argv, &checksum))
@@ -689,7 +689,7 @@ gss_write_null_verf(struct svc_rqst *rqstp)
 {
        u32     *p;
 
-       svc_putu32(rqstp->rq_res.head, htonl(RPC_AUTH_NULL));
+       svc_putnl(rqstp->rq_res.head, RPC_AUTH_NULL);
        p = rqstp->rq_res.head->iov_base + rqstp->rq_res.head->iov_len;
        /* don't really need to check if head->iov_len > PAGE_SIZE ... */
        *p++ = 0;
@@ -708,7 +708,7 @@ gss_write_verf(struct svc_rqst *rqstp, struct gss_ctx *ctx_id, u32 seq)
        u32                     *p;
        struct kvec             iov;
 
-       svc_putu32(rqstp->rq_res.head, htonl(RPC_AUTH_GSS));
+       svc_putnl(rqstp->rq_res.head, RPC_AUTH_GSS);
        xdr_seq = htonl(seq);
 
        iov.iov_base = &xdr_seq;
@@ -805,7 +805,7 @@ unwrap_integ_data(struct xdr_buf *buf, u32 seq, struct gss_ctx *ctx)
        struct xdr_netobj mic;
        struct xdr_buf integ_buf;
 
-       integ_len = ntohl(svc_getu32(&buf->head[0]));
+       integ_len = svc_getnl(&buf->head[0]);
        if (integ_len & 3)
                goto out;
        if (integ_len > buf->len)
@@ -825,7 +825,7 @@ unwrap_integ_data(struct xdr_buf *buf, u32 seq, struct gss_ctx *ctx)
        maj_stat = gss_verify_mic(ctx, &integ_buf, &mic);
        if (maj_stat != GSS_S_COMPLETE)
                goto out;
-       if (ntohl(svc_getu32(&buf->head[0])) != seq)
+       if (svc_getnl(&buf->head[0]) != seq)
                goto out;
        stat = 0;
 out:
@@ -857,7 +857,7 @@ unwrap_priv_data(struct svc_rqst *rqstp, struct xdr_buf *buf, u32 seq, struct gs
 
        rqstp->rq_sendfile_ok = 0;
 
-       priv_len = ntohl(svc_getu32(&buf->head[0]));
+       priv_len = svc_getnl(&buf->head[0]);
        if (rqstp->rq_deferred) {
                /* Already decrypted last time through! The sequence number
                 * check at out_seq is unnecessary but harmless: */
@@ -895,7 +895,7 @@ unwrap_priv_data(struct svc_rqst *rqstp, struct xdr_buf *buf, u32 seq, struct gs
        if (maj_stat != GSS_S_COMPLETE)
                return -EINVAL;
 out_seq:
-       if (ntohl(svc_getu32(&buf->head[0])) != seq)
+       if (svc_getnl(&buf->head[0]) != seq)
                return -EINVAL;
        return 0;
 }
@@ -985,12 +985,12 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
 
        if (argv->iov_len < 5 * 4)
                goto auth_err;
-       crlen = ntohl(svc_getu32(argv));
-       if (ntohl(svc_getu32(argv)) != RPC_GSS_VERSION)
+       crlen = svc_getnl(argv);
+       if (svc_getnl(argv) != RPC_GSS_VERSION)
                goto auth_err;
-       gc->gc_proc = ntohl(svc_getu32(argv));
-       gc->gc_seq = ntohl(svc_getu32(argv));
-       gc->gc_svc = ntohl(svc_getu32(argv));
+       gc->gc_proc = svc_getnl(argv);
+       gc->gc_seq = svc_getnl(argv);
+       gc->gc_svc = svc_getnl(argv);
        if (svc_safe_getnetobj(argv, &gc->gc_ctx))
                goto auth_err;
        if (crlen != round_up_to_quad(gc->gc_ctx.len) + 5 * 4)
@@ -1016,9 +1016,9 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
        case RPC_GSS_PROC_CONTINUE_INIT:
                if (argv->iov_len < 2 * 4)
                        goto auth_err;
-               if (ntohl(svc_getu32(argv)) != RPC_AUTH_NULL)
+               if (svc_getnl(argv) != RPC_AUTH_NULL)
                        goto auth_err;
-               if (ntohl(svc_getu32(argv)) != 0)
+               if (svc_getnl(argv) != 0)
                        goto auth_err;
                break;
        case RPC_GSS_PROC_DATA:
@@ -1076,14 +1076,14 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
                                goto drop;
                        if (resv->iov_len + 4 > PAGE_SIZE)
                                goto drop;
-                       svc_putu32(resv, rpc_success);
+                       svc_putnl(resv, RPC_SUCCESS);
                        if (svc_safe_putnetobj(resv, &rsip->out_handle))
                                goto drop;
                        if (resv->iov_len + 3 * 4 > PAGE_SIZE)
                                goto drop;
-                       svc_putu32(resv, htonl(rsip->major_status));
-                       svc_putu32(resv, htonl(rsip->minor_status));
-                       svc_putu32(resv, htonl(GSS_SEQ_WIN));
+                       svc_putnl(resv, rsip->major_status);
+                       svc_putnl(resv, rsip->minor_status);
+                       svc_putnl(resv, GSS_SEQ_WIN);
                        if (svc_safe_putnetobj(resv, &rsip->out_token))
                                goto drop;
                        rqstp->rq_client = NULL;
@@ -1093,7 +1093,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
                set_bit(CACHE_NEGATIVE, &rsci->h.flags);
                if (resv->iov_len + 4 > PAGE_SIZE)
                        goto drop;
-               svc_putu32(resv, rpc_success);
+               svc_putnl(resv, RPC_SUCCESS);
                goto complete;
        case RPC_GSS_PROC_DATA:
                *authp = rpcsec_gsserr_ctxproblem;
@@ -1111,8 +1111,8 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
                                goto auth_err;
                        /* placeholders for length and seq. number: */
                        svcdata->body_start = resv->iov_base + resv->iov_len;
-                       svc_putu32(resv, 0);
-                       svc_putu32(resv, 0);
+                       svc_putnl(resv, 0);
+                       svc_putnl(resv, 0);
                        break;
                case RPC_GSS_SVC_PRIVACY:
                        if (unwrap_priv_data(rqstp, &rqstp->rq_arg,
@@ -1120,8 +1120,8 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
                                goto auth_err;
                        /* placeholders for length and seq. number: */
                        svcdata->body_start = resv->iov_base + resv->iov_len;
-                       svc_putu32(resv, 0);
-                       svc_putu32(resv, 0);
+                       svc_putnl(resv, 0);
+                       svc_putnl(resv, 0);
                        break;
                default:
                        goto auth_err;
@@ -1199,7 +1199,7 @@ svcauth_gss_wrap_resp_integ(struct svc_rqst *rqstp)
        mic.data = (u8 *)resv->iov_base + resv->iov_len + 4;
        if (gss_get_mic(gsd->rsci->mechctx, &integ_buf, &mic))
                goto out_err;
-       svc_putu32(resv, htonl(mic.len));
+       svc_putnl(resv, mic.len);
        memset(mic.data + mic.len, 0,
                        round_up_to_quad(mic.len) - mic.len);
        resv->iov_len += XDR_QUADLEN(mic.len) << 2;
index b76a227..6589e1a 100644 (file)
@@ -284,16 +284,16 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
        rqstp->rq_sendfile_ok = 1;
        /* tcp needs a space for the record length... */
        if (rqstp->rq_prot == IPPROTO_TCP)
-               svc_putu32(resv, 0);
+               svc_putnl(resv, 0);
 
        rqstp->rq_xid = svc_getu32(argv);
        svc_putu32(resv, rqstp->rq_xid);
 
-       dir  = ntohl(svc_getu32(argv));
-       vers = ntohl(svc_getu32(argv));
+       dir  = svc_getnl(argv);
+       vers = svc_getnl(argv);
 
        /* First words of reply: */
-       svc_putu32(resv, xdr_one);              /* REPLY */
+       svc_putnl(resv, 1);             /* REPLY */
 
        if (dir != 0)           /* direction != CALL */
                goto err_bad_dir;
@@ -303,11 +303,11 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
        /* Save position in case we later decide to reject: */
        accept_statp = resv->iov_base + resv->iov_len;
 
-       svc_putu32(resv, xdr_zero);             /* ACCEPT */
+       svc_putnl(resv, 0);             /* ACCEPT */
 
-       rqstp->rq_prog = prog = ntohl(svc_getu32(argv));        /* program number */
-       rqstp->rq_vers = vers = ntohl(svc_getu32(argv));        /* version number */
-       rqstp->rq_proc = proc = ntohl(svc_getu32(argv));        /* procedure number */
+       rqstp->rq_prog = prog = svc_getnl(argv);        /* program number */
+       rqstp->rq_vers = vers = svc_getnl(argv);        /* version number */
+       rqstp->rq_proc = proc = svc_getnl(argv);        /* procedure number */
 
        progp = serv->sv_program;
 
@@ -361,7 +361,7 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
 
        /* Build the reply header. */
        statp = resv->iov_base +resv->iov_len;
-       svc_putu32(resv, rpc_success);          /* RPC_SUCCESS */
+       svc_putnl(resv, RPC_SUCCESS);
 
        /* Bump per-procedure stats counter */
        procp->pc_count++;
@@ -439,10 +439,10 @@ err_bad_dir:
 
 err_bad_rpc:
        serv->sv_stats->rpcbadfmt++;
-       svc_putu32(resv, xdr_one);      /* REJECT */
-       svc_putu32(resv, xdr_zero);     /* RPC_MISMATCH */
-       svc_putu32(resv, xdr_two);      /* Only RPCv2 supported */
-       svc_putu32(resv, xdr_two);
+       svc_putnl(resv, 1);     /* REJECT */
+       svc_putnl(resv, 0);     /* RPC_MISMATCH */
+       svc_putnl(resv, 2);     /* Only RPCv2 supported */
+       svc_putnl(resv, 2);
        goto sendit;
 
 err_bad_auth:
@@ -450,15 +450,15 @@ err_bad_auth:
        serv->sv_stats->rpcbadauth++;
        /* Restore write pointer to location of accept status: */
        xdr_ressize_check(rqstp, accept_statp);
-       svc_putu32(resv, xdr_one);      /* REJECT */
-       svc_putu32(resv, xdr_one);      /* AUTH_ERROR */
-       svc_putu32(resv, auth_stat);    /* status */
+       svc_putnl(resv, 1);     /* REJECT */
+       svc_putnl(resv, 1);     /* AUTH_ERROR */
+       svc_putnl(resv, ntohl(auth_stat));      /* status */
        goto sendit;
 
 err_bad_prog:
        dprintk("svc: unknown program %d\n", prog);
        serv->sv_stats->rpcbadfmt++;
-       svc_putu32(resv, rpc_prog_unavail);
+       svc_putnl(resv, RPC_PROG_UNAVAIL);
        goto sendit;
 
 err_bad_vers:
@@ -466,9 +466,9 @@ err_bad_vers:
        printk("svc: unknown version (%d)\n", vers);
 #endif
        serv->sv_stats->rpcbadfmt++;
-       svc_putu32(resv, rpc_prog_mismatch);
-       svc_putu32(resv, htonl(progp->pg_lovers));
-       svc_putu32(resv, htonl(progp->pg_hivers));
+       svc_putnl(resv, RPC_PROG_MISMATCH);
+       svc_putnl(resv, progp->pg_lovers);
+       svc_putnl(resv, progp->pg_hivers);
        goto sendit;
 
 err_bad_proc:
@@ -476,7 +476,7 @@ err_bad_proc:
        printk("svc: unknown procedure (%d)\n", proc);
 #endif
        serv->sv_stats->rpcbadfmt++;
-       svc_putu32(resv, rpc_proc_unavail);
+       svc_putnl(resv, RPC_PROC_UNAVAIL);
        goto sendit;
 
 err_garbage:
@@ -486,6 +486,6 @@ err_garbage:
        rpc_stat = rpc_garbage_args;
 err_bad:
        serv->sv_stats->rpcbadfmt++;
-       svc_putu32(resv, rpc_stat);
+       svc_putnl(resv, ntohl(rpc_stat));
        goto sendit;
 }
index 5b28c61..3f4d1f6 100644 (file)
@@ -42,7 +42,7 @@ svc_authenticate(struct svc_rqst *rqstp, u32 *authp)
 
        *authp = rpc_auth_ok;
 
-       flavor = ntohl(svc_getu32(&rqstp->rq_arg.head[0]));
+       flavor = svc_getnl(&rqstp->rq_arg.head[0]);
 
        dprintk("svc: svc_authenticate (%d)\n", flavor);
 
index 7e5707e..27f443b 100644 (file)
@@ -427,7 +427,7 @@ svcauth_null_accept(struct svc_rqst *rqstp, u32 *authp)
                *authp = rpc_autherr_badcred;
                return SVC_DENIED;
        }
-       if (svc_getu32(argv) != RPC_AUTH_NULL || svc_getu32(argv) != 0) {
+       if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
                dprintk("svc: bad null verf\n");
                *authp = rpc_autherr_badverf;
                return SVC_DENIED;
@@ -441,8 +441,8 @@ svcauth_null_accept(struct svc_rqst *rqstp, u32 *authp)
                return SVC_DROP; /* kmalloc failure - client must retry */
 
        /* Put NULL verifier */
-       svc_putu32(resv, RPC_AUTH_NULL);
-       svc_putu32(resv, 0);
+       svc_putnl(resv, RPC_AUTH_NULL);
+       svc_putnl(resv, 0);
 
        return SVC_OK;
 }
@@ -488,31 +488,31 @@ svcauth_unix_accept(struct svc_rqst *rqstp, u32 *authp)
 
        svc_getu32(argv);                       /* length */
        svc_getu32(argv);                       /* time stamp */
-       slen = XDR_QUADLEN(ntohl(svc_getu32(argv)));    /* machname length */
+       slen = XDR_QUADLEN(svc_getnl(argv));    /* machname length */
        if (slen > 64 || (len -= (slen + 3)*4) < 0)
                goto badcred;
        argv->iov_base = (void*)((u32*)argv->iov_base + slen);  /* skip machname */
        argv->iov_len -= slen*4;
 
-       cred->cr_uid = ntohl(svc_getu32(argv));         /* uid */
-       cred->cr_gid = ntohl(svc_getu32(argv));         /* gid */
-       slen = ntohl(svc_getu32(argv));                 /* gids length */
+       cred->cr_uid = svc_getnl(argv);         /* uid */
+       cred->cr_gid = svc_getnl(argv);         /* gid */
+       slen = svc_getnl(argv);                 /* gids length */
        if (slen > 16 || (len -= (slen + 2)*4) < 0)
                goto badcred;
        cred->cr_group_info = groups_alloc(slen);
        if (cred->cr_group_info == NULL)
                return SVC_DROP;
        for (i = 0; i < slen; i++)
-               GROUP_AT(cred->cr_group_info, i) = ntohl(svc_getu32(argv));
+               GROUP_AT(cred->cr_group_info, i) = svc_getnl(argv);
 
-       if (svc_getu32(argv) != RPC_AUTH_NULL || svc_getu32(argv) != 0) {
+       if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
                *authp = rpc_autherr_badverf;
                return SVC_DENIED;
        }
 
        /* Put NULL verifier */
-       svc_putu32(resv, RPC_AUTH_NULL);
-       svc_putu32(resv, 0);
+       svc_putnl(resv, RPC_AUTH_NULL);
+       svc_putnl(resv, 0);
 
        return SVC_OK;