]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
KEYS: Add a key type op to permit the key description to be vetted
authorDavid Howells <dhowells@redhat.com>
Mon, 7 Mar 2011 15:05:59 +0000 (15:05 +0000)
committerJames Morris <jmorris@namei.org>
Tue, 8 Mar 2011 00:17:15 +0000 (11:17 +1100)
Add a key type operation to permit the key type to vet the description of a new
key that key_alloc() is about to allocate.  The operation may reject the
description if it wishes with an error of its choosing.  If it does this, the
key will not be allocated.

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Mimi Zohar <zohar@us.ibm.com>
Signed-off-by: James Morris <jmorris@namei.org>
Documentation/keys.txt
include/linux/key-type.h
net/rxrpc/ar-key.c
security/keys/key.c

index e4dbbdb1bd961e7a7a582c3dbb3ada1008218218..cf68d1fed95dc03c7d7082201a9375f695dd822f 100644 (file)
@@ -1062,6 +1062,13 @@ The structure has a number of fields, some of which are mandatory:
      viable.
 
 
+ (*) int (*vet_description)(const char *description);
+
+     This optional method is called to vet a key description.  If the key type
+     doesn't approve of the key description, it may return an error, otherwise
+     it should return 0.
+
+
  (*) int (*instantiate)(struct key *key, const void *data, size_t datalen);
 
      This method is called to attach a payload to a key during construction.
index 65833d4d59988788ffa432211d3a18f0609fd220..fc8525e838b7818ebd678d45309d20380bc4f60c 100644 (file)
@@ -41,6 +41,9 @@ struct key_type {
         */
        size_t def_datalen;
 
+       /* vet a description */
+       int (*vet_description)(const char *description);
+
        /* instantiate a key of this type
         * - this method should call key_payload_reserve() to determine if the
         *   user's quota will hold the payload
index d763793d39de4476dec0ff7b0e7fee557176f56c..43ea7de2fc8ee8e4cef2c006052d3f11f9f67167 100644 (file)
@@ -25,6 +25,7 @@
 #include <keys/user-type.h>
 #include "ar-internal.h"
 
+static int rxrpc_vet_description_s(const char *);
 static int rxrpc_instantiate(struct key *, const void *, size_t);
 static int rxrpc_instantiate_s(struct key *, const void *, size_t);
 static void rxrpc_destroy(struct key *);
@@ -52,12 +53,30 @@ EXPORT_SYMBOL(key_type_rxrpc);
  */
 struct key_type key_type_rxrpc_s = {
        .name           = "rxrpc_s",
+       .vet_description = rxrpc_vet_description_s,
        .instantiate    = rxrpc_instantiate_s,
        .match          = user_match,
        .destroy        = rxrpc_destroy_s,
        .describe       = rxrpc_describe,
 };
 
+/*
+ * Vet the description for an RxRPC server key
+ */
+static int rxrpc_vet_description_s(const char *desc)
+{
+       unsigned long num;
+       char *p;
+
+       num = simple_strtoul(desc, &p, 10);
+       if (*p != ':' || num > 65535)
+               return -EINVAL;
+       num = simple_strtoul(p + 1, &p, 10);
+       if (*p || num < 1 || num > 255)
+               return -EINVAL;
+       return 0;
+}
+
 /*
  * parse an RxKAD type XDR format token
  * - the caller guarantees we have at least 4 words
index 1c2d43dc5107ecbe66bb8a5077876147ab785719..8e315ef2e88ebb1b439f0ac7b0a72b794fb84fbb 100644 (file)
@@ -249,6 +249,14 @@ struct key *key_alloc(struct key_type *type, const char *desc,
        if (!desc || !*desc)
                goto error;
 
+       if (type->vet_description) {
+               ret = type->vet_description(desc);
+               if (ret < 0) {
+                       key = ERR_PTR(ret);
+                       goto error;
+               }
+       }
+
        desclen = strlen(desc) + 1;
        quotalen = desclen + type->def_datalen;