Commit 5d19e20b authored by David Howells's avatar David Howells

KEYS: keyring: Provide key preparsing

Provide key preparsing in the keyring so that we can make preparsing
mandatory.  For keyrings, however, only an empty payload is permitted.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Acked-by: default avatarSteve Dickson <steved@redhat.com>
Acked-by: default avatarJeff Layton <jlayton@primarydata.com>
parent 002edaf7
...@@ -73,6 +73,8 @@ static inline unsigned keyring_hash(const char *desc) ...@@ -73,6 +73,8 @@ static inline unsigned keyring_hash(const char *desc)
* can be treated as ordinary keys in addition to having their own special * can be treated as ordinary keys in addition to having their own special
* operations. * operations.
*/ */
static int keyring_preparse(struct key_preparsed_payload *prep);
static void keyring_free_preparse(struct key_preparsed_payload *prep);
static int keyring_instantiate(struct key *keyring, static int keyring_instantiate(struct key *keyring,
struct key_preparsed_payload *prep); struct key_preparsed_payload *prep);
static void keyring_revoke(struct key *keyring); static void keyring_revoke(struct key *keyring);
...@@ -84,6 +86,8 @@ static long keyring_read(const struct key *keyring, ...@@ -84,6 +86,8 @@ static long keyring_read(const struct key *keyring,
struct key_type key_type_keyring = { struct key_type key_type_keyring = {
.name = "keyring", .name = "keyring",
.def_datalen = 0, .def_datalen = 0,
.preparse = keyring_preparse,
.free_preparse = keyring_free_preparse,
.instantiate = keyring_instantiate, .instantiate = keyring_instantiate,
.match = user_match, .match = user_match,
.revoke = keyring_revoke, .revoke = keyring_revoke,
...@@ -122,6 +126,21 @@ static void keyring_publish_name(struct key *keyring) ...@@ -122,6 +126,21 @@ static void keyring_publish_name(struct key *keyring)
} }
} }
/*
* Preparse a keyring payload
*/
static int keyring_preparse(struct key_preparsed_payload *prep)
{
return prep->datalen != 0 ? -EINVAL : 0;
}
/*
* Free a preparse of a user defined key payload
*/
static void keyring_free_preparse(struct key_preparsed_payload *prep)
{
}
/* /*
* Initialise a keyring. * Initialise a keyring.
* *
...@@ -130,17 +149,10 @@ static void keyring_publish_name(struct key *keyring) ...@@ -130,17 +149,10 @@ static void keyring_publish_name(struct key *keyring)
static int keyring_instantiate(struct key *keyring, static int keyring_instantiate(struct key *keyring,
struct key_preparsed_payload *prep) struct key_preparsed_payload *prep)
{ {
int ret; assoc_array_init(&keyring->keys);
/* make the keyring available by name if it has one */
ret = -EINVAL; keyring_publish_name(keyring);
if (prep->datalen == 0) { return 0;
assoc_array_init(&keyring->keys);
/* make the keyring available by name if it has one */
keyring_publish_name(keyring);
ret = 0;
}
return ret;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment