rxrpc: Make the parsing of xdr payloads more coherent
authorDavid Howells <dhowells@redhat.com>
Sun, 27 Sep 2020 10:17:03 +0000 (11:17 +0100)
committerDavid Howells <dhowells@redhat.com>
Mon, 23 Nov 2020 18:09:30 +0000 (18:09 +0000)
Make the parsing of xdr-encoded payloads, as passed to add_key, more
coherent.  Shuttling back and forth between various variables was a bit
hard to follow.

Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/key.c

index ed29ec01237be606797b8713f1f718702121a444..a9d8f5b466be652e6df5a029efcd1c462d3a1c29 100644 (file)
@@ -135,7 +135,7 @@ static int rxrpc_preparse_xdr_rxkad(struct key_preparsed_payload *prep,
  */
 static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep)
 {
-       const __be32 *xdr = prep->data, *token;
+       const __be32 *xdr = prep->data, *token, *p;
        const char *cp;
        unsigned int len, paddedlen, loop, ntoken, toklen, sec_ix;
        size_t datalen = prep->datalen;
@@ -189,20 +189,20 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep)
                goto not_xdr;
 
        /* check each token wrapper */
-       token = xdr;
+       p = xdr;
        loop = ntoken;
        do {
                if (datalen < 8)
                        goto not_xdr;
-               toklen = ntohl(*xdr++);
-               sec_ix = ntohl(*xdr);
+               toklen = ntohl(*p++);
+               sec_ix = ntohl(*p);
                datalen -= 4;
                _debug("token: [%x/%zx] %x", toklen, datalen, sec_ix);
                paddedlen = (toklen + 3) & ~3;
                if (toklen < 20 || toklen > datalen || paddedlen > datalen)
                        goto not_xdr;
                datalen -= paddedlen;
-               xdr += paddedlen >> 2;
+               p += paddedlen >> 2;
 
        } while (--loop > 0);
 
@@ -214,17 +214,18 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep)
         * - we ignore the cellname, relying on the key to be correctly named
         */
        do {
-               xdr = token;
                toklen = ntohl(*xdr++);
-               token = xdr + ((toklen + 3) >> 2);
-               sec_ix = ntohl(*xdr++);
+               token = xdr;
+               xdr += (toklen + 3) / 4;
+
+               sec_ix = ntohl(*token++);
                toklen -= 4;
 
-               _debug("TOKEN type=%u [%p-%p]", sec_ix, xdr, token);
+               _debug("TOKEN type=%x len=%x", sec_ix, toklen);
 
                switch (sec_ix) {
                case RXRPC_SECURITY_RXKAD:
-                       ret = rxrpc_preparse_xdr_rxkad(prep, datalen, xdr, toklen);
+                       ret = rxrpc_preparse_xdr_rxkad(prep, datalen, token, toklen);
                        if (ret != 0)
                                goto error;
                        break;