diff options
| author | David Howells <dhowells@redhat.com> | 2014-07-18 13:56:36 -0400 |
|---|---|---|
| committer | David Howells <dhowells@redhat.com> | 2014-07-22 16:46:51 -0400 |
| commit | 5d19e20b534ff4c17dfba792f1f9e33e1378e3f9 (patch) | |
| tree | 5ce389c633aa2362112146355f634abd677fdce7 /security | |
| parent | 002edaf76f09af658241029817f5ef66f6bef5e4 (diff) | |
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: David Howells <dhowells@redhat.com>
Acked-by: Steve Dickson <steved@redhat.com>
Acked-by: Jeff Layton <jlayton@primarydata.com>
Diffstat (limited to 'security')
| -rw-r--r-- | security/keys/keyring.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/security/keys/keyring.c b/security/keys/keyring.c index 9cf2575f0d97..8314a7d2104d 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c | |||
| @@ -73,6 +73,8 @@ static inline unsigned keyring_hash(const char *desc) | |||
| 73 | * can be treated as ordinary keys in addition to having their own special | 73 | * can be treated as ordinary keys in addition to having their own special |
| 74 | * operations. | 74 | * operations. |
| 75 | */ | 75 | */ |
| 76 | static int keyring_preparse(struct key_preparsed_payload *prep); | ||
| 77 | static void keyring_free_preparse(struct key_preparsed_payload *prep); | ||
| 76 | static int keyring_instantiate(struct key *keyring, | 78 | static int keyring_instantiate(struct key *keyring, |
| 77 | struct key_preparsed_payload *prep); | 79 | struct key_preparsed_payload *prep); |
| 78 | static void keyring_revoke(struct key *keyring); | 80 | static void keyring_revoke(struct key *keyring); |
| @@ -84,6 +86,8 @@ static long keyring_read(const struct key *keyring, | |||
| 84 | struct key_type key_type_keyring = { | 86 | struct key_type key_type_keyring = { |
| 85 | .name = "keyring", | 87 | .name = "keyring", |
| 86 | .def_datalen = 0, | 88 | .def_datalen = 0, |
| 89 | .preparse = keyring_preparse, | ||
| 90 | .free_preparse = keyring_free_preparse, | ||
| 87 | .instantiate = keyring_instantiate, | 91 | .instantiate = keyring_instantiate, |
| 88 | .match = user_match, | 92 | .match = user_match, |
| 89 | .revoke = keyring_revoke, | 93 | .revoke = keyring_revoke, |
| @@ -123,6 +127,21 @@ static void keyring_publish_name(struct key *keyring) | |||
| 123 | } | 127 | } |
| 124 | 128 | ||
| 125 | /* | 129 | /* |
| 130 | * Preparse a keyring payload | ||
| 131 | */ | ||
| 132 | static int keyring_preparse(struct key_preparsed_payload *prep) | ||
| 133 | { | ||
| 134 | return prep->datalen != 0 ? -EINVAL : 0; | ||
| 135 | } | ||
| 136 | |||
| 137 | /* | ||
| 138 | * Free a preparse of a user defined key payload | ||
| 139 | */ | ||
| 140 | static void keyring_free_preparse(struct key_preparsed_payload *prep) | ||
| 141 | { | ||
| 142 | } | ||
| 143 | |||
| 144 | /* | ||
| 126 | * Initialise a keyring. | 145 | * Initialise a keyring. |
| 127 | * | 146 | * |
| 128 | * Returns 0 on success, -EINVAL if given any data. | 147 | * Returns 0 on success, -EINVAL if given any data. |
| @@ -130,17 +149,10 @@ static void keyring_publish_name(struct key *keyring) | |||
| 130 | static int keyring_instantiate(struct key *keyring, | 149 | static int keyring_instantiate(struct key *keyring, |
| 131 | struct key_preparsed_payload *prep) | 150 | struct key_preparsed_payload *prep) |
| 132 | { | 151 | { |
| 133 | int ret; | 152 | assoc_array_init(&keyring->keys); |
| 134 | 153 | /* make the keyring available by name if it has one */ | |
| 135 | ret = -EINVAL; | 154 | keyring_publish_name(keyring); |
| 136 | if (prep->datalen == 0) { | 155 | return 0; |
| 137 | assoc_array_init(&keyring->keys); | ||
| 138 | /* make the keyring available by name if it has one */ | ||
| 139 | keyring_publish_name(keyring); | ||
| 140 | ret = 0; | ||
| 141 | } | ||
| 142 | |||
| 143 | return ret; | ||
| 144 | } | 156 | } |
| 145 | 157 | ||
| 146 | /* | 158 | /* |
