summaryrefslogtreecommitdiff
path: root/kernel/crash_dump_dm_crypt.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman2026-03-04 07:24:37 -0500
committerGreg Kroah-Hartman2026-03-04 07:25:12 -0500
commit2c8fedbbbb8266b792c1bfec0dbcbed77d61fa8d (patch)
treeddd97d859c2b7440f5a69f219d553adf814d20b8 /kernel/crash_dump_dm_crypt.c
parent0c87214ec2d8da6478321a9e5b4c1e1f81fbf861 (diff)
parent6258e292d7463f96d0f06dff2a39093a54c9d16f (diff)
Merge v6.18.16
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'kernel/crash_dump_dm_crypt.c')
-rw-r--r--kernel/crash_dump_dm_crypt.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index 401423ba477d..abb307a23de3 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -143,6 +143,7 @@ static int read_key_from_user_keying(struct dm_crypt_key *dm_key)
{
const struct user_key_payload *ukp;
struct key *key;
+ int ret = 0;
kexec_dprintk("Requesting logon key %s", dm_key->key_desc);
key = request_key(&key_type_logon, dm_key->key_desc, NULL);
@@ -152,20 +153,28 @@ static int read_key_from_user_keying(struct dm_crypt_key *dm_key)
return PTR_ERR(key);
}
+ down_read(&key->sem);
ukp = user_key_payload_locked(key);
- if (!ukp)
- return -EKEYREVOKED;
+ if (!ukp) {
+ ret = -EKEYREVOKED;
+ goto out;
+ }
if (ukp->datalen > KEY_SIZE_MAX) {
pr_err("Key size %u exceeds maximum (%u)\n", ukp->datalen, KEY_SIZE_MAX);
- return -EINVAL;
+ ret = -EINVAL;
+ goto out;
}
memcpy(dm_key->data, ukp->data, ukp->datalen);
dm_key->key_size = ukp->datalen;
kexec_dprintk("Get dm crypt key (size=%u) %s: %8ph\n", dm_key->key_size,
dm_key->key_desc, dm_key->data);
- return 0;
+
+out:
+ up_read(&key->sem);
+ key_put(key);
+ return ret;
}
struct config_key {