[RFC PATCH 3/6] keys: verify key identity on unlink and move

From: Jarkko Sakkinen

Date: Fri Oct 16 2026 - 17:57:08 EST


__key_unlink_begin() matches keys by index key without checking pointer
identity. If distinct keys share type and description, unlinking or moving
one can mistakenly unlink the other.

Verify key pointer identity before unlinking, returning -ENOENT on
mismatch.

Fixes: b2a4df200d57 ("KEYS: Expand the capacity of a keyring")
Assisted-by: LLM
Signed-off-by: Jarkko Sakkinen <jarkko@xxxxxxxxxx>
---
security/keys/keyring.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/security/keys/keyring.c b/security/keys/keyring.c
index db987c891811..9ccce0db0665 100644
--- a/security/keys/keyring.c
+++ b/security/keys/keyring.c
@@ -1501,9 +1501,15 @@ static int __key_unlink_begin(struct key *keyring, struct key *key,
struct assoc_array_edit **_edit)
{
struct assoc_array_edit *edit;
+ const void *object;

BUG_ON(*_edit != NULL);

+ object = assoc_array_find(&keyring->keys, &keyring_assoc_array_ops,
+ &key->index_key);
+ if (!object || keyring_ptr_to_key(object) != key)
+ return -ENOENT;
+
edit = assoc_array_delete(&keyring->keys, &keyring_assoc_array_ops,
&key->index_key);
if (IS_ERR(edit))
--
2.47.3