* [PATCH v12 1/6] s390/cert_store: Pin the user session keyring
[not found] <20261114164139.429814-1-jarkko@kernel.org>
@ 2026-11-14 16:41 ` Jarkko Sakkinen
2026-11-14 16:41 ` [PATCH v12 2/6] s390/cert_store: Return an owned reference from find_cs_keyring() Jarkko Sakkinen
2026-11-14 16:41 ` [PATCH v12 3/6] s390/cert_store: Skip keys that disappeared during invalidation Jarkko Sakkinen
2 siblings, 0 replies; 3+ messages in thread
From: Jarkko Sakkinen @ 2026-11-14 16:41 UTC (permalink / raw)
To: David Howells
Cc: Jarkko Sakkinen, bpf, dm-devel, fsverity, keyrings, linux-doc,
linux-kernel, linux-kselftest, linux-security-module,
Alasdair Kergon, Alexander Gordeev, Alexei Starovoitov, Alex Shi,
Anastasia Eskova, Andrew Morton, Andrii Nakryiko,
Benjamin Marzinski, Christian Borntraeger, Daniel Borkmann,
Dongliang Mu, Eduard Zingerman, Emil Tsalapatis, Eric Biggers,
Ignat Korchagin, Heiko Carstens, Ihor Solodrai, James Bottomley,
James Morris, Jiri Olsa, Jonathan Corbet, Kumar Kartikeya Dwivedi,
Linus Torvalds, Martin KaFai Lau, Mike Snitzer, Mikulas Patocka,
Mimi Zohar, Paul Moore, Peter Oberparleiter, Randy Dunlap,
Roberto Sassu, Serge E. Hallyn, Shuah Khan, Song Liu,
Sven Schnelle, Theodore Y. Ts'o, Vasily Gorbik, Yanteng Si,
Yonghong Song, stable
The user session keyring stays alive only because the session keyring is
pinned by current_cred().
Pin the reference at:
1. find_cs_keyring()
2. cleanup_cs_keys()
3. create_cs_keyring()
Cc: David Howells <dhowells@redhat.com>
Cc: stable@vger.kernel.org # v6.1+
Fixes: 8cf57d7217c3 ("s390: add support for user-defined certificates")
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
---
arch/s390/kernel/cert_store.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/arch/s390/kernel/cert_store.c b/arch/s390/kernel/cert_store.c
index 998f2da56175..bb218b42a2c9 100644
--- a/arch/s390/kernel/cert_store.c
+++ b/arch/s390/kernel/cert_store.c
@@ -307,7 +307,6 @@ static struct key *get_user_session_keyring(void)
PTR_ERR(us_keyring_ref));
return ERR_PTR(-ENOKEY);
}
- key_ref_put(us_keyring_ref);
return key_ref_to_ptr(us_keyring_ref);
}
@@ -352,11 +351,17 @@ static int invalidate_keyring_keys(struct key *keyring)
static struct key *find_cs_keyring(void)
{
key_ref_t cs_keyring_ref;
+ struct key *us_keyring;
struct key *cs_keyring;
- cs_keyring_ref = keyring_search(make_key_ref(get_user_session_keyring(), true),
+ us_keyring = get_user_session_keyring();
+ if (IS_ERR(us_keyring))
+ return NULL;
+
+ cs_keyring_ref = keyring_search(make_key_ref(us_keyring, true),
&key_type_keyring, CERT_STORE_KEYRING_NAME,
false);
+ key_put(us_keyring);
if (!IS_ERR(cs_keyring_ref)) {
cs_keyring = key_ref_to_ptr(cs_keyring_ref);
key_ref_put(cs_keyring_ref);
@@ -373,6 +378,7 @@ static struct key *find_cs_keyring(void)
static void cleanup_cs_keys(void)
{
+ struct key *us_keyring;
struct key *cs_keyring;
cs_keyring = find_cs_keyring();
@@ -390,20 +396,33 @@ static void cleanup_cs_keys(void)
keyring_clear(cs_keyring);
key_invalidate(cs_keyring);
key_put(cs_keyring);
- key_unlink(get_user_session_keyring(), cs_keyring);
+
+ us_keyring = get_user_session_keyring();
+ if (IS_ERR(us_keyring))
+ return;
+
+ key_unlink(us_keyring, cs_keyring);
+ key_put(us_keyring);
}
static struct key *create_cs_keyring(void)
{
static struct key *cs_keyring;
+ struct key *us_keyring;
/* Cleanup previous cs_keyring and all associated keys if any. */
cleanup_cs_keys();
+
+ us_keyring = get_user_session_keyring();
+ if (IS_ERR(us_keyring))
+ return NULL;
+
cs_keyring = keyring_alloc(CERT_STORE_KEYRING_NAME, GLOBAL_ROOT_UID,
GLOBAL_ROOT_GID, current_cred(),
(KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW | KEY_USR_READ,
KEY_ALLOC_NOT_IN_QUOTA | KEY_ALLOC_SET_KEEP,
- NULL, get_user_session_keyring());
+ NULL, us_keyring);
+ key_put(us_keyring);
if (IS_ERR(cs_keyring)) {
pr_dbf_msg("Can't allocate cert_store keyring");
return NULL;
--
2.47.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v12 2/6] s390/cert_store: Return an owned reference from find_cs_keyring()
[not found] <20261114164139.429814-1-jarkko@kernel.org>
2026-11-14 16:41 ` [PATCH v12 1/6] s390/cert_store: Pin the user session keyring Jarkko Sakkinen
@ 2026-11-14 16:41 ` Jarkko Sakkinen
2026-11-14 16:41 ` [PATCH v12 3/6] s390/cert_store: Skip keys that disappeared during invalidation Jarkko Sakkinen
2 siblings, 0 replies; 3+ messages in thread
From: Jarkko Sakkinen @ 2026-11-14 16:41 UTC (permalink / raw)
To: David Howells
Cc: Jarkko Sakkinen, bpf, dm-devel, fsverity, keyrings, linux-doc,
linux-kernel, linux-kselftest, linux-security-module,
Alasdair Kergon, Alexander Gordeev, Alexei Starovoitov, Alex Shi,
Anastasia Eskova, Andrew Morton, Andrii Nakryiko,
Benjamin Marzinski, Christian Borntraeger, Daniel Borkmann,
Dongliang Mu, Eduard Zingerman, Emil Tsalapatis, Eric Biggers,
Ignat Korchagin, Heiko Carstens, Ihor Solodrai, James Bottomley,
James Morris, Jiri Olsa, Jonathan Corbet, Kumar Kartikeya Dwivedi,
Linus Torvalds, Martin KaFai Lau, Mike Snitzer, Mikulas Patocka,
Mimi Zohar, Paul Moore, Peter Oberparleiter, Randy Dunlap,
Roberto Sassu, Serge E. Hallyn, Shuah Khan, Song Liu,
Sven Schnelle, Theodore Y. Ts'o, Vasily Gorbik, Yanteng Si,
Yonghong Song, stable
Return an owned reference from find_cs_keyring() so that it will not get
dropped.
Cc: David Howells <dhowells@redhat.com>
Cc: stable@vger.kernel.org # v6.6+
Fixes: 8cf57d7217c3 ("s390: add support for user-defined certificates")
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
---
arch/s390/kernel/cert_store.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/arch/s390/kernel/cert_store.c b/arch/s390/kernel/cert_store.c
index bb218b42a2c9..0a10b31d68af 100644
--- a/arch/s390/kernel/cert_store.c
+++ b/arch/s390/kernel/cert_store.c
@@ -362,17 +362,13 @@ static struct key *find_cs_keyring(void)
&key_type_keyring, CERT_STORE_KEYRING_NAME,
false);
key_put(us_keyring);
- if (!IS_ERR(cs_keyring_ref)) {
- cs_keyring = key_ref_to_ptr(cs_keyring_ref);
- key_ref_put(cs_keyring_ref);
- goto found;
- }
+ if (!IS_ERR(cs_keyring_ref))
+ return key_ref_to_ptr(cs_keyring_ref);
+
/* Search default locations: thread, process, session keyrings */
cs_keyring = request_key(&key_type_keyring, CERT_STORE_KEYRING_NAME, NULL);
if (IS_ERR(cs_keyring))
return NULL;
- key_put(cs_keyring);
-found:
return cs_keyring;
}
@@ -395,14 +391,16 @@ static void cleanup_cs_keys(void)
keyring_clear(cs_keyring);
key_invalidate(cs_keyring);
- key_put(cs_keyring);
us_keyring = get_user_session_keyring();
- if (IS_ERR(us_keyring))
+ if (IS_ERR(us_keyring)) {
+ key_put(cs_keyring);
return;
+ }
key_unlink(us_keyring, cs_keyring);
key_put(us_keyring);
+ key_put(cs_keyring);
}
static struct key *create_cs_keyring(void)
@@ -729,13 +727,12 @@ static int fill_cs_keyring(void)
goto cleanup_keys;
rc = add_certificates_to_keyring(vcssb, cs_keyring);
+ key_put(cs_keyring);
if (rc)
- goto cleanup_cs_keyring;
+ goto cleanup_keys;
goto out;
-cleanup_cs_keyring:
- key_put(cs_keyring);
cleanup_keys:
cleanup_cs_keys();
out:
--
2.47.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v12 3/6] s390/cert_store: Skip keys that disappeared during invalidation
[not found] <20261114164139.429814-1-jarkko@kernel.org>
2026-11-14 16:41 ` [PATCH v12 1/6] s390/cert_store: Pin the user session keyring Jarkko Sakkinen
2026-11-14 16:41 ` [PATCH v12 2/6] s390/cert_store: Return an owned reference from find_cs_keyring() Jarkko Sakkinen
@ 2026-11-14 16:41 ` Jarkko Sakkinen
2 siblings, 0 replies; 3+ messages in thread
From: Jarkko Sakkinen @ 2026-11-14 16:41 UTC (permalink / raw)
To: David Howells
Cc: Jarkko Sakkinen, bpf, dm-devel, fsverity, keyrings, linux-doc,
linux-kernel, linux-kselftest, linux-security-module,
Alasdair Kergon, Alexander Gordeev, Alexei Starovoitov, Alex Shi,
Anastasia Eskova, Andrew Morton, Andrii Nakryiko,
Benjamin Marzinski, Christian Borntraeger, Daniel Borkmann,
Dongliang Mu, Eduard Zingerman, Emil Tsalapatis, Eric Biggers,
Ignat Korchagin, Heiko Carstens, Ihor Solodrai, James Bottomley,
James Morris, Jiri Olsa, Jonathan Corbet, Kumar Kartikeya Dwivedi,
Linus Torvalds, Martin KaFai Lau, Mike Snitzer, Mikulas Patocka,
Mimi Zohar, Paul Moore, Peter Oberparleiter, Randy Dunlap,
Roberto Sassu, Serge E. Hallyn, Shuah Khan, Song Liu,
Sven Schnelle, Theodore Y. Ts'o, Vasily Gorbik, Yanteng Si,
Yonghong Song, stable
key_lookup() can return NULL for an unlinked key. Skip such keys instead.
Cc: David Howells <dhowells@redhat.com>
Cc: stable@vger.kernel.org # v6.6+
Fixes: 8cf57d7217c3 ("s390: add support for user-defined certificates")
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
---
arch/s390/kernel/cert_store.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/s390/kernel/cert_store.c b/arch/s390/kernel/cert_store.c
index 0a10b31d68af..03391b379dad 100644
--- a/arch/s390/kernel/cert_store.c
+++ b/arch/s390/kernel/cert_store.c
@@ -331,8 +331,13 @@ static int invalidate_keyring_keys(struct key *keyring)
goto out;
}
+ rc = 0;
+
for (key_index = 0; key_index < num_keys; key_index++) {
current_key = key_lookup(key_array[key_index]);
+ if (IS_ERR(current_key))
+ continue;
+
pr_dbf_msg("Invalidating key %08x", current_key->serial);
key_invalidate(current_key);
--
2.47.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-14 16:41 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20261114164139.429814-1-jarkko@kernel.org>
2026-11-14 16:41 ` [PATCH v12 1/6] s390/cert_store: Pin the user session keyring Jarkko Sakkinen
2026-11-14 16:41 ` [PATCH v12 2/6] s390/cert_store: Return an owned reference from find_cs_keyring() Jarkko Sakkinen
2026-11-14 16:41 ` [PATCH v12 3/6] s390/cert_store: Skip keys that disappeared during invalidation Jarkko Sakkinen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox