From: Coiby Xu <coiby.xu@gmail.com>
To: Guangshuo Li <lgs201920130244@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Baoquan He <baoquan.he@linux.dev>,
Mike Rapoport <rppt@kernel.org>,
Pasha Tatashin <pasha.tatashin@soleen.com>,
Pratyush Yadav <pratyush@kernel.org>,
Dave Young <ruirui.yang@linux.dev>, Coiby Xu <coxu@redhat.com>,
kexec@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] crash_dump: release keyring reference at the correct time
Date: Mon, 6 Jul 2026 10:59:40 +0800 [thread overview]
Message-ID: <aksWPOkN7IgZ6ffn@Rk> (raw)
In-Reply-To: <20260704112509.3717884-1-lgs201920130244@gmail.com>
On Sat, Jul 04, 2026 at 07:25:09PM +0800, Guangshuo Li wrote:
>restore_dm_crypt_keys_to_thread_keyring() gets a reference to the user
>keyring before restoring the saved dm-crypt keys.
>
>The same keyring reference is then passed to add_key_to_keyring() for each
>saved key, but add_key_to_keyring() drops that reference on every call.
>This is only balanced when exactly one key is restored. With multiple
>keys, the keyring reference is dropped too many times and may trigger a
>refcount underflow or use-after-free.
>
>When more than five keys are restored, a refcount underflow/use-after-free
>warning can be triggered.
>
>The early error paths after lookup_user_key() also return without dropping
>the keyring reference.
>
>Keep ownership of the keyring reference in
>restore_dm_crypt_keys_to_thread_keyring(), drop it once on all exit paths,
>and make add_key_to_keyring() only use the reference without consuming it.
>
>Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
>Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
>---
>v2:
> - Mention the refcount underflow/use-after warning seen when restoring
> more than five keys, as suggested by Coiby Xu.
> - Order local variables in reverse Christmas tree style.
>
> kernel/crash_dump_dm_crypt.c | 15 ++++++++++-----
> 1 file changed, 10 insertions(+), 5 deletions(-)
>
>diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
>index cb875ddb6ba6..c685497cd470 100644
>--- a/kernel/crash_dump_dm_crypt.c
>+++ b/kernel/crash_dump_dm_crypt.c
>@@ -81,7 +81,6 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
> kexec_dprintk("Error when adding key");
> }
>
>- key_ref_put(keyring_ref);
> return r;
> }
>
>@@ -104,6 +103,7 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
> struct dm_crypt_key *key;
> size_t keys_header_size;
> key_ref_t keyring_ref;
>+ int ret = 0;
> u64 addr;
>
> /* find the target keyring (which must be writable) */
>@@ -118,7 +118,8 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
> dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr);
> if (key_count > KEY_NUM_MAX) {
> kexec_dprintk("Failed to read the number of dm-crypt keys\n");
>- return -1;
>+ ret = -1;
>+ goto out;
> }
>
> kexec_dprintk("There are %u keys\n", key_count);
>@@ -126,8 +127,10 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
>
> keys_header_size = get_keys_header_size(key_count);
> keys_header = kzalloc(keys_header_size, GFP_KERNEL);
>- if (!keys_header)
>- return -ENOMEM;
>+ if (!keys_header) {
>+ ret = -ENOMEM;
>+ goto out;
>+ }
>
> dm_crypt_keys_read((char *)keys_header, keys_header_size, &addr);
>
>@@ -137,7 +140,9 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
> add_key_to_keyring(key, keyring_ref);
> }
>
>- return 0;
>+out:
>+ key_ref_put(keyring_ref);
>+ return ret;
> }
>
> static int read_key_from_user_keyring(struct dm_crypt_key *dm_key)
>--
>2.43.0
>
>
Hi Guangshuo,
Thanks for addressing my feedback!
Reviewed-and-tested-by: Coiby Xu <Coiby.Xu@gmail.com>
--
Best regards,
Coiby
next prev parent reply other threads:[~2026-07-06 3:00 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-04 11:25 [PATCH v2] crash_dump: release keyring reference at the correct time Guangshuo Li
2026-07-06 2:59 ` Coiby Xu [this message]
2026-07-12 12:00 ` Baoquan He
2026-07-12 12:02 ` Bradley Morgan
2026-07-13 7:06 ` Mike Rapoport
2026-07-13 12:41 ` Pratyush Yadav
2026-07-13 13:30 ` Mike Rapoport
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=aksWPOkN7IgZ6ffn@Rk \
--to=coiby.xu@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=baoquan.he@linux.dev \
--cc=coxu@redhat.com \
--cc=kexec@lists.infradead.org \
--cc=lgs201920130244@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pasha.tatashin@soleen.com \
--cc=pratyush@kernel.org \
--cc=rppt@kernel.org \
--cc=ruirui.yang@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.