On Sun, Nov 27, 2022 at 05:07:20PM +0000, Anton Borowka wrote: > Hi, > > I was trying to create a certificate with an URI SAN using > p5-io-socket-ssl and got a segfault in > lib/libcrypto/x509/x509_constraints.c:x509_constraints_uri_host() > > perl -MIO::Socket::SSL::Utils -le 'CERT_create > ext=>[{sn=>"subjectAltName",data=>"URI:urn:open62541.server.application"}]' > > I think it is a regression since the "Fix URI name constraints, allow > for URI's with no host part." change in > x509_constraints.c. x509_constraints_uri_host() is called from > x509_alt.c:v2i_GENERAL_NAME_ex() with NULL as hostpart which can not be > dereferenced. > > The diff below adds a check for NULL and fixed the issue for me.
Thanks. Can also be triggered with openssl req -new -addext 'subjectAltName = URI:urn:blah' Below the original diff with a small tweak to the constraints regress that would have triggered the issue. Not really a big deal since it can only be reached via v2i. Unless I hear objections, I'm going to commit this tomorrow. Index: lib/libcrypto/x509/x509_constraints.c =================================================================== RCS file: /cvs/src/lib/libcrypto/x509/x509_constraints.c,v retrieving revision 1.29 diff -u -p -r1.29 x509_constraints.c --- lib/libcrypto/x509/x509_constraints.c 11 Nov 2022 12:02:34 -0000 1.29 +++ lib/libcrypto/x509/x509_constraints.c 27 Nov 2022 17:27:19 -0000 @@ -530,7 +530,8 @@ x509_constraints_uri_host(uint8_t *uri, * we indicate that we have a URI with an empty * host part, and succeed. */ - *hostpart = strdup(""); + if (hostpart != NULL) + *hostpart = strdup(""); return 1; } for (i = authority - uri; i < len; i++) { Index: regress/lib/libcrypto/x509/constraints.c =================================================================== RCS file: /cvs/src/regress/lib/libcrypto/x509/constraints.c,v retrieving revision 1.14 diff -u -p -r1.14 constraints.c --- regress/lib/libcrypto/x509/constraints.c 23 Nov 2022 23:06:16 -0000 1.14 +++ regress/lib/libcrypto/x509/constraints.c 27 Nov 2022 17:48:41 -0000 @@ -466,6 +466,8 @@ test_constraints1(void) char *hostpart = NULL; error = 0; if (!x509_constraints_uri_host(noauthority[j], + strlen(noauthority[j]), NULL) || + !x509_constraints_uri_host(noauthority[j], strlen(noauthority[j]), &hostpart)) { FAIL("name '%s' should parse as a URI", noauthority[j]);