diff --git a/ext/openssl/openssl_backend_common.c b/ext/openssl/openssl_backend_common.c index 611359cccaba6..539ecf8397fcc 100644 --- a/ext/openssl/openssl_backend_common.c +++ b/ext/openssl/openssl_backend_common.c @@ -666,7 +666,57 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension) as = name->d.uniformResourceIdentifier; BIO_write(bio, ASN1_STRING_get0_data(as), ASN1_STRING_length(as)); - break; + break; + case GEN_DIRNAME: + BIO_puts(bio,"DirName:"); + + X509_NAME *dirn = name->d.dirn; + char *oneline; + + if (dirn != NULL && (oneline = X509_NAME_oneline(dirn, NULL, 0)) != NULL) + { + char *comma = strchr(oneline, ','); + if (comma != NULL) + { + BIO_puts(bio,oneline); + } + else + { + char *p = oneline; + char *seg_start = oneline; + + while (*p != '\0') { + if (*p == ',') { + if (p > seg_start) { + size_t len = (size_t)(p - seg_start); + while (len > 0) { + int chunk = (len > INT_MAX) ? INT_MAX : (int)len; + BIO_write(bio, seg_start, chunk); + seg_start += chunk; + len -= (size_t)chunk; + } + } + + BIO_write(bio, "\\,", 2); + seg_start = p + 1; + } + p++; + } + + if (p > seg_start) + { + size_t len = (size_t)(p - seg_start); + while (len > 0) { + int chunk = (len > INT_MAX) ? INT_MAX : (int)len; + BIO_write(bio, seg_start, chunk); + seg_start += chunk; + len -= (size_t)chunk; + } + } + } + OPENSSL_free(oneline); + } + break; default: /* use builtin print for GEN_OTHERNAME, GEN_X400, * GEN_EDIPARTY, GEN_DIRNAME, GEN_IPADD and GEN_RID diff --git a/ext/openssl/tests/subjectAltName.phpt b/ext/openssl/tests/subjectAltName.phpt new file mode 100644 index 0000000000000..10b009a3ca0af --- /dev/null +++ b/ext/openssl/tests/subjectAltName.phpt @@ -0,0 +1,50 @@ +--TEST-- +DirName in subjectAltName uses name-style notation with escaped commas +--EXTENSIONS-- +openssl +--FILE-- + +--EXPECT-- +HAS_DIRNAME_PREFIX +COMMA_ESCAPED \ No newline at end of file