From: sashiko-bot@kernel.org
To: "Jarkko Sakkinen" <jarkko@kernel.org>,
"David Howells" <dhowells@redhat.com>
Cc: bpf@vger.kernel.org, dm-devel@lists.linux.dev,
fsverity@lists.linux.dev, keyrings@vger.kernel.org,
linux-security-module@vger.kernel.org,
"Alasdair Kergon" <agk@redhat.com>,
"Alexei Starovoitov" <ast@kernel.org>,
"Alex Shi" <alexs@kernel.org>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Andrii Nakryiko" <andrii@kernel.org>,
"Benjamin Marzinski" <bmarzins@redhat.com>,
"Daniel Borkmann" <daniel@iogearbox.net>,
"Dongliang Mu" <dzm91@hust.edu.cn>,
"Eduard Zingerman" <eddyz87@gmail.com>,
"Emil Tsalapatis" <emil@etsalapatis.com>,
"Eric Biggers" <ebiggers@kernel.org>,
"Ignat Korchagin" <ignat@linux.win>,
"Ihor Solodrai" <ihor.solodrai@linux.dev>,
"James Morris" <jmorris@namei.org>,
"Jiri Olsa" <jolsa@kernel.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"Kumar Kartikeya Dwivedi" <memxor@gmail.com>,
"Martin KaFai Lau" <martin.lau@linux.dev>,
"Mike Snitzer" <snitzer@kernel.org>,
"Mikulas Patocka" <mpatocka@redhat.com>,
"Paul Moore" <paul@paul-moore.com>,
"Randy Dunlap" <rdunlap@infradead.org>,
"Serge E. Hallyn" <serge@hallyn.com>,
"Shuah Khan" <skhan@linuxfoundation.org>,
"Song Liu" <song@kernel.org>, "Theodore Y. Ts'o" <tytso@mit.edu>,
"Yanteng Si" <si.yanteng@linux.dev>,
"Yonghong Song" <yonghong.song@linux.dev>,
"Linus Torvalds" <torvalds@linux-foundation.org>
Subject: Re: [PATCH v8 2/3] KEYS: Replace assoc_array with rhashtable
Date: Tue, 10 Nov 2026 05:03:58 +0000 [thread overview]
Message-ID: <sashiko-outbox-206254@kernel.org> (raw)
In-Reply-To: <20261110044043.2608600-3-jarkko@kernel.org>
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()
--
commit 1bfb81a86d8ef725610c02d9a07de1a279485dd1
Author: Jarkko Sakkinen <jarkko@kernel.org>
KEYS: Replace assoc_array with rhashtable
This commit replaces struct assoc_array in struct key with a new
rhashtable- and list-backed struct keyring_index and struct keyring_link
implementation.
> diff --git a/security/keys/keyring.c b/security/keys/keyring.c
> index ac48d6204915a..60309f18e3a56 100644
> --- a/security/keys/keyring.c
> +++ b/security/keys/keyring.c
[ ... ]
> @@ -1317,57 +1155,94 @@ int __key_move_lock(struct key *l_keyring, struct key *u_keyring,
> int __key_link_begin(struct key *keyring,
> const struct keyring_index_key *index_key,
> - struct assoc_array_edit **_edit)
> + struct keyring_edit *edit)
> {
> - struct assoc_array_edit *edit;
> + struct keyring_link *replace;
> + struct keyring_index *links;
> int ret;
>
> kenter("%d,%s,%s,",
> keyring->serial, index_key->type->name, index_key->description);
>
> - BUG_ON(index_key->desc_len == 0);
> - BUG_ON(*_edit != NULL);
> + if (WARN_ON(index_key->desc_len == 0) || WARN_ON(edit->new)) {
> + ret = -EINVAL;
> + goto out;
> + }
>
> - *_edit = NULL;
> + edit->new = NULL;
> + edit->old = NULL;
>
> - ret = -EKEYREVOKED;
> - if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
> - goto error;
> + if (test_bit(KEY_FLAG_REVOKED, &keyring->flags)) {
> + ret = -EKEYREVOKED;
> + goto out;
> + }
>
> - /* Create an edit script that will insert/replace the key in the
> - * keyring tree.
> - */
> - edit = assoc_array_insert(&keyring->keys,
> - &keyring_assoc_array_ops,
> - index_key,
> - NULL);
> - if (IS_ERR(edit)) {
> - ret = PTR_ERR(edit);
> - goto error;
> + links = keyring_get_index(keyring);
> + if (IS_ERR(links)) {
> + ret = PTR_ERR(links);
> + goto out;
> }
>
> - /* If we're not replacing a link in-place then we're going to need some
> + struct keyring_link *link __free(kfree) = kzalloc_obj(struct keyring_link);
[Severity: Critical]
Do the three goto out statements above jump past the initialization of
link __free(kfree) into its scope?
This breaks the build with Clang (and GCC with -Werror=jump-misses-init),
and without stack auto-initialization, linking a key into a revoked
keyring jumps to out and runs kfree(link) on an uninitialized stack
pointer. Returning early instead of jumping to out avoids entering the
cleanup scope before link is initialized.
> + if (!link) {
> + ret = -ENOMEM;
> + goto out;
> + }
> + link->hash = index_key->hash;
> +
> + replace = keyring_find_link(links, index_key);
> +
> + /*
> + * If we're not replacing a link in-place then we're going to need some
> * extra quota.
> */
> - if (!edit->dead_leaf) {
> + if (!replace) {
> ret = key_payload_reserve(keyring,
> keyring->datalen + KEYQUOTA_LINK_BYTES);
> if (ret < 0)
> - goto error_cancel;
> + goto out;
> +
> + ret = rhashtable_insert_fast(&links->ht, &link->node,
> + keyring_link_params);
> + if (ret < 0) {
> + key_payload_reserve(keyring,
> + keyring->datalen - KEYQUOTA_LINK_BYTES);
> + goto out;
> + }
> }
>
> - *_edit = edit;
> - kleave(" = 0");
> - return 0;
> + edit->new = no_free_ptr(link);
> + edit->old = replace;
>
> -error_cancel:
> - assoc_array_cancel_edit(edit);
> -error:
> +out:
> kleave(" = %d", ret);
> return ret;
> }
[Severity: Critical]
Does __key_link_begin() return an uninitialized ret when replace is
non-NULL?
When a matching key already exists in the keyring, the if (!replace)
block is skipped without setting ret = 0. In __key_create_or_update(), a
negative stack value below -MAX_ERRNO makes ERR_PTR(ret) return a
non-error pointer that add_key() dereferences and passes to
key_ref_put(). In key_reject_and_link(), a positive stack value skips
both the link_ret < 0 and link_ret == 0 paths, leaking edit.new and
returning with keyring->sem write-locked.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261110044043.2608600-1-jarkko@kernel.org?part=2
next prev parent reply other threads:[~2026-11-10 5:04 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 4:40 [PATCH v8 0/3] KEYS: Replace assoc_array with rhashtable Jarkko Sakkinen
2026-11-10 4:40 ` [PATCH v8 1/3] KEYS: Introduce keyring_is_empty() Jarkko Sakkinen
2026-11-10 4:46 ` sashiko-bot
2026-11-10 4:40 ` [PATCH v8 2/3] KEYS: Replace assoc_array with rhashtable Jarkko Sakkinen
2026-11-10 5:03 ` sashiko-bot [this message]
2026-11-10 5:21 ` Jarkko Sakkinen
2026-11-10 4:40 ` [PATCH v8 3/3] lib: Remove assoc_array Jarkko Sakkinen
2026-11-10 4:45 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=sashiko-outbox-206254@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=agk@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=alexs@kernel.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bmarzins@redhat.com \
--cc=bpf@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=daniel@iogearbox.net \
--cc=dhowells@redhat.com \
--cc=dm-devel@lists.linux.dev \
--cc=dzm91@hust.edu.cn \
--cc=ebiggers@kernel.org \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=fsverity@lists.linux.dev \
--cc=ignat@linux.win \
--cc=ihor.solodrai@linux.dev \
--cc=jarkko@kernel.org \
--cc=jmorris@namei.org \
--cc=jolsa@kernel.org \
--cc=keyrings@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=mpatocka@redhat.com \
--cc=paul@paul-moore.com \
--cc=rdunlap@infradead.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=serge@hallyn.com \
--cc=si.yanteng@linux.dev \
--cc=skhan@linuxfoundation.org \
--cc=snitzer@kernel.org \
--cc=song@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.