]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
x509: avoid NULL memcmp argument in nc_dn()
authorMounir IDRASSI <mounir.idrassi@idrix.fr>
Wed, 1 Jul 2026 14:43:18 +0000 (23:43 +0900)
committerTomas Mraz <tomas@openssl.foundation>
Fri, 10 Jul 2026 15:50:55 +0000 (17:50 +0200)
An empty directoryName constraint has canon_enc == NULL and
canon_enclen == 0. nc_dn() must not pass that pointer to
memcmp(), even with a zero length.

Return X509_V_OK before comparing an empty base Name. This preserves
current match semantics and avoids UBSan-visible undefined behaviour.

Fixes #31687
Fixes #31688

Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Daniel Kubec <kubec@openssl.foundation>
MergeDate: Fri Jul 10 15:51:01 2026
(Merged from https://github.com/openssl/openssl/pull/31814)

crypto/x509/v3_ncons.c

index 8217bedc7bde4e42582092abc09ae1b32a1c59e9..5f2710e9f5077e50fd1a09b92a4bcf2eb8130e8a 100644 (file)
@@ -615,6 +615,12 @@ static int nc_dn(const X509_NAME *nm, const X509_NAME *base)
         return X509_V_ERR_OUT_OF_MEM;
     if (base->canon_enclen > nm->canon_enclen)
         return X509_V_ERR_PERMITTED_VIOLATION;
+    /*
+     * An empty base Name has no canonical encoding (canon_enc == NULL) and is
+     * a prefix of every Name, so it matches unconditionally.
+     */
+    if (base->canon_enclen == 0)
+        return X509_V_OK;
     if (memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen))
         return X509_V_ERR_PERMITTED_VIOLATION;
     return X509_V_OK;