mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
keys: Add a 'recurse' flag for keyring searches
Add a 'recurse' flag for keyring searches so that the flag can be omitted and recursion disabled, thereby allowing just the nominated keyring to be searched and none of the children. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -127,6 +127,7 @@ struct keyring_search_context {
|
||||
#define KEYRING_SEARCH_NO_CHECK_PERM 0x0008 /* Don't check permissions */
|
||||
#define KEYRING_SEARCH_DETECT_TOO_DEEP 0x0010 /* Give an error on excessive depth */
|
||||
#define KEYRING_SEARCH_SKIP_EXPIRED 0x0020 /* Ignore expired keys (intention to replace) */
|
||||
#define KEYRING_SEARCH_RECURSE 0x0040 /* Search child keyrings also */
|
||||
|
||||
int (*iterator)(const void *object, void *iterator_data);
|
||||
|
||||
|
||||
@@ -762,7 +762,7 @@ long keyctl_keyring_search(key_serial_t ringid,
|
||||
}
|
||||
|
||||
/* do the search */
|
||||
key_ref = keyring_search(keyring_ref, ktype, description);
|
||||
key_ref = keyring_search(keyring_ref, ktype, description, true);
|
||||
if (IS_ERR(key_ref)) {
|
||||
ret = PTR_ERR(key_ref);
|
||||
|
||||
|
||||
@@ -685,6 +685,9 @@ descend_to_keyring:
|
||||
* Non-keyrings avoid the leftmost branch of the root entirely (root
|
||||
* slots 1-15).
|
||||
*/
|
||||
if (!(ctx->flags & KEYRING_SEARCH_RECURSE))
|
||||
goto not_this_keyring;
|
||||
|
||||
ptr = READ_ONCE(keyring->keys.root);
|
||||
if (!ptr)
|
||||
goto not_this_keyring;
|
||||
@@ -885,13 +888,15 @@ key_ref_t keyring_search_rcu(key_ref_t keyring_ref,
|
||||
* @keyring: The root of the keyring tree to be searched.
|
||||
* @type: The type of keyring we want to find.
|
||||
* @description: The name of the keyring we want to find.
|
||||
* @recurse: True to search the children of @keyring also
|
||||
*
|
||||
* As keyring_search_rcu() above, but using the current task's credentials and
|
||||
* type's default matching function and preferred search method.
|
||||
*/
|
||||
key_ref_t keyring_search(key_ref_t keyring,
|
||||
struct key_type *type,
|
||||
const char *description)
|
||||
const char *description,
|
||||
bool recurse)
|
||||
{
|
||||
struct keyring_search_context ctx = {
|
||||
.index_key.type = type,
|
||||
@@ -906,6 +911,8 @@ key_ref_t keyring_search(key_ref_t keyring,
|
||||
key_ref_t key;
|
||||
int ret;
|
||||
|
||||
if (recurse)
|
||||
ctx.flags |= KEYRING_SEARCH_RECURSE;
|
||||
if (type->match_preparse) {
|
||||
ret = type->match_preparse(&ctx.match_data);
|
||||
if (ret < 0)
|
||||
@@ -1176,7 +1183,8 @@ static int keyring_detect_cycle(struct key *A, struct key *B)
|
||||
.flags = (KEYRING_SEARCH_NO_STATE_CHECK |
|
||||
KEYRING_SEARCH_NO_UPDATE_TIME |
|
||||
KEYRING_SEARCH_NO_CHECK_PERM |
|
||||
KEYRING_SEARCH_DETECT_TOO_DEEP),
|
||||
KEYRING_SEARCH_DETECT_TOO_DEEP |
|
||||
KEYRING_SEARCH_RECURSE),
|
||||
};
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
@@ -170,7 +170,8 @@ static int proc_keys_show(struct seq_file *m, void *v)
|
||||
.match_data.cmp = lookup_user_key_possessed,
|
||||
.match_data.raw_data = key,
|
||||
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
|
||||
.flags = KEYRING_SEARCH_NO_STATE_CHECK,
|
||||
.flags = (KEYRING_SEARCH_NO_STATE_CHECK |
|
||||
KEYRING_SEARCH_RECURSE),
|
||||
};
|
||||
|
||||
key_ref = make_key_ref(key, 0);
|
||||
|
||||
@@ -531,7 +531,8 @@ key_ref_t lookup_user_key(key_serial_t id, unsigned long lflags,
|
||||
struct keyring_search_context ctx = {
|
||||
.match_data.cmp = lookup_user_key_possessed,
|
||||
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
|
||||
.flags = KEYRING_SEARCH_NO_STATE_CHECK,
|
||||
.flags = (KEYRING_SEARCH_NO_STATE_CHECK |
|
||||
KEYRING_SEARCH_RECURSE),
|
||||
};
|
||||
struct request_key_auth *rka;
|
||||
struct key *key;
|
||||
|
||||
@@ -569,7 +569,8 @@ struct key *request_key_and_link(struct key_type *type,
|
||||
.match_data.raw_data = description,
|
||||
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
|
||||
.flags = (KEYRING_SEARCH_DO_STATE_CHECK |
|
||||
KEYRING_SEARCH_SKIP_EXPIRED),
|
||||
KEYRING_SEARCH_SKIP_EXPIRED |
|
||||
KEYRING_SEARCH_RECURSE),
|
||||
};
|
||||
struct key *key;
|
||||
key_ref_t key_ref;
|
||||
|
||||
@@ -252,7 +252,8 @@ struct key *key_get_instantiation_authkey(key_serial_t target_id)
|
||||
.match_data.cmp = key_default_cmp,
|
||||
.match_data.raw_data = description,
|
||||
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
|
||||
.flags = KEYRING_SEARCH_DO_STATE_CHECK,
|
||||
.flags = (KEYRING_SEARCH_DO_STATE_CHECK |
|
||||
KEYRING_SEARCH_RECURSE),
|
||||
};
|
||||
struct key *authkey;
|
||||
key_ref_t authkey_ref;
|
||||
|
||||
Reference in New Issue
Block a user