diff options
| author | David Howells <dhowells@redhat.com> | 2014-07-18 13:56:35 -0400 |
|---|---|---|
| committer | David Howells <dhowells@redhat.com> | 2014-07-22 16:46:17 -0400 |
| commit | f9167789df53f22af771fb6690a3d36aa21d74c5 (patch) | |
| tree | b57ff2ec18945f20c113150c4d6d126812da7b8b /security/keys | |
| parent | 4d8c0250b841159b128785f7a7efbaff40cc8501 (diff) | |
KEYS: user: Use key preparsing
Make use of key preparsing in user-defined and logon keys so that quota size
determination can take place prior to keyring locking when a key is being
added.
Also the idmapper key types need to change to match as they use the
user-defined key type routines.
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/keys')
| -rw-r--r-- | security/keys/user_defined.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c index faa2caeb593f..eee340011f2b 100644 --- a/security/keys/user_defined.c +++ b/security/keys/user_defined.c | |||
| @@ -27,7 +27,9 @@ static int logon_vet_description(const char *desc); | |||
| 27 | struct key_type key_type_user = { | 27 | struct key_type key_type_user = { |
| 28 | .name = "user", | 28 | .name = "user", |
| 29 | .def_lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, | 29 | .def_lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, |
| 30 | .instantiate = user_instantiate, | 30 | .preparse = user_preparse, |
| 31 | .free_preparse = user_free_preparse, | ||
| 32 | .instantiate = generic_key_instantiate, | ||
| 31 | .update = user_update, | 33 | .update = user_update, |
| 32 | .match = user_match, | 34 | .match = user_match, |
| 33 | .revoke = user_revoke, | 35 | .revoke = user_revoke, |
| @@ -47,7 +49,9 @@ EXPORT_SYMBOL_GPL(key_type_user); | |||
| 47 | struct key_type key_type_logon = { | 49 | struct key_type key_type_logon = { |
| 48 | .name = "logon", | 50 | .name = "logon", |
| 49 | .def_lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, | 51 | .def_lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, |
| 50 | .instantiate = user_instantiate, | 52 | .preparse = user_preparse, |
| 53 | .free_preparse = user_free_preparse, | ||
| 54 | .instantiate = generic_key_instantiate, | ||
| 51 | .update = user_update, | 55 | .update = user_update, |
| 52 | .match = user_match, | 56 | .match = user_match, |
| 53 | .revoke = user_revoke, | 57 | .revoke = user_revoke, |
| @@ -58,38 +62,37 @@ struct key_type key_type_logon = { | |||
| 58 | EXPORT_SYMBOL_GPL(key_type_logon); | 62 | EXPORT_SYMBOL_GPL(key_type_logon); |
| 59 | 63 | ||
| 60 | /* | 64 | /* |
| 61 | * instantiate a user defined key | 65 | * Preparse a user defined key payload |
| 62 | */ | 66 | */ |
| 63 | int user_instantiate(struct key *key, struct key_preparsed_payload *prep) | 67 | int user_preparse(struct key_preparsed_payload *prep) |
| 64 | { | 68 | { |
| 65 | struct user_key_payload *upayload; | 69 | struct user_key_payload *upayload; |
| 66 | size_t datalen = prep->datalen; | 70 | size_t datalen = prep->datalen; |
| 67 | int ret; | ||
| 68 | 71 | ||
| 69 | ret = -EINVAL; | ||
| 70 | if (datalen <= 0 || datalen > 32767 || !prep->data) | 72 | if (datalen <= 0 || datalen > 32767 || !prep->data) |
| 71 | goto error; | 73 | return -EINVAL; |
| 72 | |||
| 73 | ret = key_payload_reserve(key, datalen); | ||
| 74 | if (ret < 0) | ||
| 75 | goto error; | ||
| 76 | 74 | ||
| 77 | ret = -ENOMEM; | ||
| 78 | upayload = kmalloc(sizeof(*upayload) + datalen, GFP_KERNEL); | 75 | upayload = kmalloc(sizeof(*upayload) + datalen, GFP_KERNEL); |
| 79 | if (!upayload) | 76 | if (!upayload) |
| 80 | goto error; | 77 | return -ENOMEM; |
| 81 | 78 | ||
| 82 | /* attach the data */ | 79 | /* attach the data */ |
| 80 | prep->quotalen = datalen; | ||
| 81 | prep->payload[0] = upayload; | ||
| 83 | upayload->datalen = datalen; | 82 | upayload->datalen = datalen; |
| 84 | memcpy(upayload->data, prep->data, datalen); | 83 | memcpy(upayload->data, prep->data, datalen); |
| 85 | rcu_assign_keypointer(key, upayload); | 84 | return 0; |
| 86 | ret = 0; | ||
| 87 | |||
| 88 | error: | ||
| 89 | return ret; | ||
| 90 | } | 85 | } |
| 86 | EXPORT_SYMBOL_GPL(user_preparse); | ||
| 91 | 87 | ||
| 92 | EXPORT_SYMBOL_GPL(user_instantiate); | 88 | /* |
| 89 | * Free a preparse of a user defined key payload | ||
| 90 | */ | ||
| 91 | void user_free_preparse(struct key_preparsed_payload *prep) | ||
| 92 | { | ||
| 93 | kfree(prep->payload[0]); | ||
| 94 | } | ||
| 95 | EXPORT_SYMBOL_GPL(user_free_preparse); | ||
| 93 | 96 | ||
| 94 | /* | 97 | /* |
| 95 | * update a user defined key | 98 | * update a user defined key |
