[openssh-commits] [openssh] 45/87: upstream: avoid fatal() if a PKCS#11 key was added multiple times
git+noreply at mindrot.org
git+noreply at mindrot.org
Fri Oct 30 20:21:22 AEDT 2026
This is an automated email from the git hooks/post-receive script.
djm pushed a commit to branch master
in repository openssh.
commit a73db88df08a74e797ff99b17a2e585f91e6be23
Author: djm at openbsd.org <djm at openbsd.org>
AuthorDate: Fri Oct 30 04:48:41 2026 +0000
upstream: avoid fatal() if a PKCS#11 key was added multiple times
(e.g. for multiple certificates) and then subsequently freed. The key-free
code incorrectly assumed that keys were singular.
Anthropic ANT-2026-V7H1QCC4
OpenBSD-Commit-ID: 9a5575d6733d91666dc86de841601d17b483df9f
---
ssh-pkcs11-client.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/ssh-pkcs11-client.c b/ssh-pkcs11-client.c
index b6d158bb4..7ab5e5a1b 100644
--- a/ssh-pkcs11-client.c
+++ b/ssh-pkcs11-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11-client.c,v 1.27 2026/10/30 01:41:01 djm Exp $ */
+/* $OpenBSD: ssh-pkcs11-client.c,v 1.28 2026/10/30 04:48:41 djm Exp $ */
/*
* Copyright (c) 2010 Markus Friedl. All rights reserved.
* Copyright (c) 2014 Pedro Martelletto. All rights reserved.
@@ -480,15 +480,20 @@ pkcs11_key_free(struct sshkey *key)
if ((r = sshkey_putb(key, keyblob)) != 0)
fatal_fr(r, "serialise key");
- /* repack keys */
+ /*
+ * Remove one record of the key and repack. A key may legitimately be
+ * recorded more than once, e.g. when pkcs11_make_cert() is called
+ * repeatedly for the same certificate, so remove the first match only
+ * and leave any others for the remaining sshkey instances.
+ */
for (i = 0; i < helper->nkeyblobs; i++) {
- if (sshbuf_equals(keyblob, helper->keyblobs[i]) == 0) {
- if (found)
- fatal_f("key recorded more than once");
+ if (!found && sshbuf_equals(keyblob, helper->keyblobs[i]) == 0) {
+ sshbuf_free(helper->keyblobs[i]);
found = 1;
} else if (found)
helper->keyblobs[i - 1] = helper->keyblobs[i];
}
+ sshbuf_free(keyblob);
if (found) {
helper->keyblobs = xrecallocarray(helper->keyblobs,
helper->nkeyblobs, helper->nkeyblobs - 1,
--
To stop receiving notification emails like this one, please contact
djm at mindrot.org.
More information about the openssh-commits
mailing list