On Tue, Nov 10, 2026 at 05:03:58AM +0000, [email protected] wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential
> issues to consider:
> - [Critical] keys: uninitialized return value in __key_link_begin() on
>   link replacement
> - [Critical] keys: goto jumps past __free(kfree) initialization in
>   __key_link_begin()

I'll retract using cleanup.h shenanigans i.e.

diff --git a/security/keys/keyring.c b/security/keys/keyring.c
index 60309f18e3a5..04d9a98c0f31 100644
--- a/security/keys/keyring.c
+++ b/security/keys/keyring.c
@@ -1185,6 +1185,7 @@ int __key_link_begin(struct key *keyring,
                     const struct keyring_index_key *index_key,
                     struct keyring_edit *edit)
 {
+       struct keyring_link *link = NULL;
        struct keyring_link *replace;
        struct keyring_index *links;
        int ret;
@@ -1211,7 +1212,7 @@ int __key_link_begin(struct key *keyring,
                goto out;
        }

-       struct keyring_link *link __free(kfree) = kzalloc_obj(struct 
keyring_link);
+       link = kzalloc_obj(struct keyring_link);
        if (!link) {
                ret = -ENOMEM;
                goto out;
@@ -1239,10 +1240,13 @@ int __key_link_begin(struct key *keyring,
                }
        }

-       edit->new = no_free_ptr(link);
+       edit->new = link;
        edit->old = replace;
+       ret = 0;

 out:
+       if (ret && link)
+               kfree(link);
        kleave(" = %d", ret);
        return ret;
 }

I went clearly over the top with the cleanup.h macros (lessons learned).

Br, Jarkko

Reply via email to