rxrpc: Ignore unknown tokens in key payload unless no known tokens
authorDavid Howells <dhowells@redhat.com>
Thu, 15 Oct 2020 14:59:36 +0000 (15:59 +0100)
committerDavid Howells <dhowells@redhat.com>
Mon, 23 Nov 2020 18:09:30 +0000 (18:09 +0000)
When parsing a payload for an rxrpc-type key, ignore any tokens that are
not of a known type and don't give an error for them - unless there are no
tokens of a known type.

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

index a9d8f5b466be652e6df5a029efcd1c462d3a1c29..7e6d19263ce3a5e5bf573a5f716b9fd378d276b8 100644 (file)
@@ -139,7 +139,7 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep)
        const char *cp;
        unsigned int len, paddedlen, loop, ntoken, toklen, sec_ix;
        size_t datalen = prep->datalen;
-       int ret;
+       int ret, ret2;
 
        _enter(",{%x,%x,%x,%x},%zu",
               ntohl(xdr[0]), ntohl(xdr[1]), ntohl(xdr[2]), ntohl(xdr[3]),
@@ -213,6 +213,7 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep)
        /* okay: we're going to assume it's valid XDR format
         * - we ignore the cellname, relying on the key to be correctly named
         */
+       ret = -EPROTONOSUPPORT;
        do {
                toklen = ntohl(*xdr++);
                token = xdr;
@@ -225,27 +226,37 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep)
 
                switch (sec_ix) {
                case RXRPC_SECURITY_RXKAD:
-                       ret = rxrpc_preparse_xdr_rxkad(prep, datalen, token, toklen);
-                       if (ret != 0)
-                               goto error;
+                       ret2 = rxrpc_preparse_xdr_rxkad(prep, datalen, token, toklen);
+                       break;
+               default:
+                       ret2 = -EPROTONOSUPPORT;
                        break;
+               }
 
+               switch (ret2) {
+               case 0:
+                       ret = 0;
+                       break;
+               case -EPROTONOSUPPORT:
+                       break;
+               case -ENOPKG:
+                       if (ret != 0)
+                               ret = -ENOPKG;
+                       break;
                default:
-                       ret = -EPROTONOSUPPORT;
+                       ret = ret2;
                        goto error;
                }
 
        } while (--ntoken > 0);
 
-       _leave(" = 0");
-       return 0;
+error:
+       _leave(" = %d", ret);
+       return ret;
 
 not_xdr:
        _leave(" = -EPROTO");
        return -EPROTO;
-error:
-       _leave(" = %d", ret);
-       return ret;
 }
 
 /*