Index | Thread | Search

From:
Theo Buehler <tb@theobuehler.org>
Subject:
rpki-client: fix use of X509_get_ext_count()
To:
tech@openbsd.org
Date:
Sat, 3 Feb 2024 14:38:58 +0100

Download raw body.

Thread
X509_get_ext_count(x) can't return < 0 since X509v3_get_ext_count()
returns 0 on an empty stack of extensions ensuring sk_*_num() returns
a non-negative value. If X509_get_ext_count() could actually return < 0,
someone could feed rpki-client a bad cert and make it error out. That's
bad, So don't do that.

A cert without any extensions will be rejected for many reasons. At the
very least it won't pass the 'missing SKI' check at the end.

Index: cert.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/cert.c,v
diff -u -p -r1.123 cert.c
--- cert.c	1 Feb 2024 15:11:38 -0000	1.123
+++ cert.c	3 Feb 2024 13:21:27 -0000
@@ -737,8 +737,7 @@ struct cert *
 cert_parse_pre(const char *fn, const unsigned char *der, size_t len)
 {
 	const unsigned char	*oder;
-	int			 extsz;
-	size_t			 i;
+	int			 i;
 	X509			*x = NULL;
 	X509_EXTENSION		*ext = NULL;
 	const X509_ALGOR	*palg;
@@ -810,10 +809,7 @@ cert_parse_pre(const char *fn, const uns
 
 	/* Look for X509v3 extensions. */
 
-	if ((extsz = X509_get_ext_count(x)) < 0)
-		errx(1, "X509_get_ext_count");
-
-	for (i = 0; i < (size_t)extsz; i++) {
+	for (i = 0; i < X509_get_ext_count(x); i++) {
 		ext = X509_get_ext(x, i);
 		assert(ext != NULL);
 		obj = X509_EXTENSION_get_object(ext);
@@ -942,7 +938,7 @@ cert_parse_pre(const char *fn, const uns
 			    p.fn);
 			goto out;
 		}
-		for (i = 0; i < p.res->asz; i++) {
+		for (i = 0; (size_t)i < p.res->asz; i++) {
 			if (p.res->as[i].type == CERT_AS_INHERIT) {
 				warnx("%s: inherit elements not allowed in EE"
 				    " cert", p.fn);