|
|
@@ -1097,15 +1097,15 @@ found:
|
|
|
/*
|
|
|
* Find a keyring with the specified name.
|
|
|
*
|
|
|
- * All named keyrings in the current user namespace are searched, provided they
|
|
|
- * grant Search permission directly to the caller (unless this check is
|
|
|
- * skipped). Keyrings whose usage points have reached zero or who have been
|
|
|
- * revoked are skipped.
|
|
|
+ * Only keyrings that have nonzero refcount, are not revoked, and are owned by a
|
|
|
+ * user in the current user namespace are considered. If @uid_keyring is %true,
|
|
|
+ * the keyring additionally must have been allocated as a user or user session
|
|
|
+ * keyring; otherwise, it must grant Search permission directly to the caller.
|
|
|
*
|
|
|
* Returns a pointer to the keyring with the keyring's refcount having being
|
|
|
* incremented on success. -ENOKEY is returned if a key could not be found.
|
|
|
*/
|
|
|
-struct key *find_keyring_by_name(const char *name, bool skip_perm_check)
|
|
|
+struct key *find_keyring_by_name(const char *name, bool uid_keyring)
|
|
|
{
|
|
|
struct key *keyring;
|
|
|
int bucket;
|
|
|
@@ -1133,10 +1133,15 @@ struct key *find_keyring_by_name(const char *name, bool skip_perm_check)
|
|
|
if (strcmp(keyring->description, name) != 0)
|
|
|
continue;
|
|
|
|
|
|
- if (!skip_perm_check &&
|
|
|
- key_permission(make_key_ref(keyring, 0),
|
|
|
- KEY_NEED_SEARCH) < 0)
|
|
|
- continue;
|
|
|
+ if (uid_keyring) {
|
|
|
+ if (!test_bit(KEY_FLAG_UID_KEYRING,
|
|
|
+ &keyring->flags))
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ if (key_permission(make_key_ref(keyring, 0),
|
|
|
+ KEY_NEED_SEARCH) < 0)
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
/* we've got a match but we might end up racing with
|
|
|
* key_cleanup() if the keyring is currently 'dead'
|