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>
This commit is contained in:
Родитель
d5953f6543
Коммит
4c20c33340
|
@ -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)
|
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;
|
const char *cp;
|
||||||
unsigned int len, paddedlen, loop, ntoken, toklen, sec_ix;
|
unsigned int len, paddedlen, loop, ntoken, toklen, sec_ix;
|
||||||
size_t datalen = prep->datalen;
|
size_t datalen = prep->datalen;
|
||||||
|
@ -189,20 +189,20 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep)
|
||||||
goto not_xdr;
|
goto not_xdr;
|
||||||
|
|
||||||
/* check each token wrapper */
|
/* check each token wrapper */
|
||||||
token = xdr;
|
p = xdr;
|
||||||
loop = ntoken;
|
loop = ntoken;
|
||||||
do {
|
do {
|
||||||
if (datalen < 8)
|
if (datalen < 8)
|
||||||
goto not_xdr;
|
goto not_xdr;
|
||||||
toklen = ntohl(*xdr++);
|
toklen = ntohl(*p++);
|
||||||
sec_ix = ntohl(*xdr);
|
sec_ix = ntohl(*p);
|
||||||
datalen -= 4;
|
datalen -= 4;
|
||||||
_debug("token: [%x/%zx] %x", toklen, datalen, sec_ix);
|
_debug("token: [%x/%zx] %x", toklen, datalen, sec_ix);
|
||||||
paddedlen = (toklen + 3) & ~3;
|
paddedlen = (toklen + 3) & ~3;
|
||||||
if (toklen < 20 || toklen > datalen || paddedlen > datalen)
|
if (toklen < 20 || toklen > datalen || paddedlen > datalen)
|
||||||
goto not_xdr;
|
goto not_xdr;
|
||||||
datalen -= paddedlen;
|
datalen -= paddedlen;
|
||||||
xdr += paddedlen >> 2;
|
p += paddedlen >> 2;
|
||||||
|
|
||||||
} while (--loop > 0);
|
} 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
|
* - we ignore the cellname, relying on the key to be correctly named
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
xdr = token;
|
|
||||||
toklen = ntohl(*xdr++);
|
toklen = ntohl(*xdr++);
|
||||||
token = xdr + ((toklen + 3) >> 2);
|
token = xdr;
|
||||||
sec_ix = ntohl(*xdr++);
|
xdr += (toklen + 3) / 4;
|
||||||
|
|
||||||
|
sec_ix = ntohl(*token++);
|
||||||
toklen -= 4;
|
toklen -= 4;
|
||||||
|
|
||||||
_debug("TOKEN type=%u [%p-%p]", sec_ix, xdr, token);
|
_debug("TOKEN type=%x len=%x", sec_ix, toklen);
|
||||||
|
|
||||||
switch (sec_ix) {
|
switch (sec_ix) {
|
||||||
case RXRPC_SECURITY_RXKAD:
|
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)
|
if (ret != 0)
|
||||||
goto error;
|
goto error;
|
||||||
break;
|
break;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче