[PATCH v2 1/9] crash_dump: Release reference to a keyring at correct time

From: Coiby Xu

Date: Fri May 01 2026 - 19:44:06 EST


It's incorrect to drop the reference only after adding one key to the
specified keyring. If there are many keys to be added, it can lead
"refcount_t: underflow; use-after-free" error and some keys will fail to
be added to the keyring. My testing shows the error can occur when there
are more than five keys.

Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
Signed-off-by: Coiby Xu <coiby.xu@xxxxxxxxx>
---
kernel/crash_dump_dm_crypt.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index cb875ddb6ba6..eac4f436a8d4 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;
}

@@ -126,8 +125,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)
+ if (!keys_header) {
+ key_ref_put(keyring_ref);
return -ENOMEM;
+ }

dm_crypt_keys_read((char *)keys_header, keys_header_size, &addr);

@@ -137,6 +138,7 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
add_key_to_keyring(key, keyring_ref);
}

+ key_ref_put(keyring_ref);
return 0;
}

--
2.54.0