[openssh-commits] [openssh] 04/14: upstream: Replace non-idiomatic strtoul(, 16) to parse a region

git+noreply at mindrot.org git+noreply at mindrot.org
Tue Apr 30 12:39:41 AEST 2024


This is an automated email from the git hooks/post-receive script.

djm pushed a commit to branch master
in repository openssh.

commit c7fec708f331f108343d69e4d74c9a5d86d6cfe7
Author: deraadt at openbsd.org <deraadt at openbsd.org>
AuthorDate: Tue Apr 2 09:32:28 2024 +0000

    upstream: Replace non-idiomatic strtoul(, 16) to parse a region
    
    of 2-character hex sequences with a low-level replacement designed just for
    the task. ok djm
    
    OpenBSD-Commit-ID: 67bab8b8a4329a19a0add5085eacd6f4cc215e85
---
 ssh-pkcs11.c | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/ssh-pkcs11.c b/ssh-pkcs11.c
index 35e98be7..9d2d99eb 100644
--- a/ssh-pkcs11.c
+++ b/ssh-pkcs11.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11.c,v 1.59 2023/07/27 22:26:49 djm Exp $ */
+/* $OpenBSD: ssh-pkcs11.c,v 1.60 2024/04/02 09:32:28 deraadt Exp $ */
 /*
  * Copyright (c) 2010 Markus Friedl.  All rights reserved.
  * Copyright (c) 2014 Pedro Martelletto. All rights reserved.
@@ -1385,6 +1385,20 @@ pkcs11_rsa_generate_private_key(struct pkcs11_provider *p, CK_ULONG slotidx,
 	return pkcs11_fetch_rsa_pubkey(p, slotidx, &pubKey);
 }
 
+static int
+h2i(char c)
+{
+	if (c >= '0' && c <= '9')
+		c -= '0';
+	else if (c >= 'a' && c <= 'f')
+		c -= 'a';
+	else if (c >= 'A' && c <= 'F')
+		c -= 'A';
+	else
+		return -1;
+	return c;
+}
+
 static int
 pkcs11_decode_hex(const char *hex, unsigned char **dest, size_t *rlen)
 {
@@ -1404,11 +1418,13 @@ pkcs11_decode_hex(const char *hex, unsigned char **dest, size_t *rlen)
 
 	ptr[2] = '\0';
 	for (i = 0; i < len; i++) {
-		ptr[0] = hex[2 * i];
-		ptr[1] = hex[(2 * i) + 1];
-		if (!isxdigit(ptr[0]) || !isxdigit(ptr[1]))
+		int hi, low;
+
+		hi = h2i(hex[2 * i]);
+		lo = h2i(hex[(2 * i) + 1]);
+		if (hi == -1 || lo == -1)
 			return -1;
-		(*dest)[i] = (unsigned char)strtoul(ptr, NULL, 16);
+		(*dest)[i] = (hi << 4) | lo;
 	}
 
 	if (rlen)

-- 
To stop receiving notification emails like this one, please contact
djm at mindrot.org.


More information about the openssh-commits mailing list