diff options
author | David Howells <dhowells@redhat.com> | 2020-09-27 12:17:03 +0200 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2020-11-23 19:09:30 +0100 |
commit | 4c20c33340269e2924d2040a5f1ca2571fd8b258 (patch) | |
tree | a1625325cadf43f9de76e651d578ac6f81d57b3a | |
parent | rxrpc: Allow security classes to give more info on server keys (diff) | |
download | linux-4c20c33340269e2924d2040a5f1ca2571fd8b258.tar.xz linux-4c20c33340269e2924d2040a5f1ca2571fd8b258.zip |
rxrpc: Make the parsing of xdr payloads more coherent
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>
-rw-r--r-- | net/rxrpc/key.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/net/rxrpc/key.c b/net/rxrpc/key.c index ed29ec01237b..a9d8f5b466be 100644 --- a/net/rxrpc/key.c +++ b/net/rxrpc/key.c @@ -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; |