Skip to content

Commit 4bc941e

Browse files
committed
Some simplification to eliminate memory management issues
1 parent 4ce6b6d commit 4bc941e

3 files changed

Lines changed: 17 additions & 21 deletions

File tree

ext/openssl/openssl.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,7 +1400,7 @@ PHP_FUNCTION(openssl_x509_parse)
14001400
char *str_serial;
14011401
char *hex_serial;
14021402
char buf[256];
1403-
zval *altname = NULL;
1403+
zval altname;
14041404

14051405
ZEND_PARSE_PARAMETERS_START(1, 2)
14061406
Z_PARAM_OBJ_OF_CLASS_OR_STR(cert_obj, php_openssl_certificate_ce, cert_str)
@@ -1516,6 +1516,7 @@ PHP_FUNCTION(openssl_x509_parse)
15161516

15171517
array_init(&subitem);
15181518
array_init(&critext);
1519+
array_init(&altname);
15191520

15201521
for (i = 0; i < X509_get_ext_count(cert); i++) {
15211522
int nid;
@@ -1562,6 +1563,10 @@ PHP_FUNCTION(openssl_x509_parse)
15621563
if (altname != NULL) {
15631564
add_assoc_zval(return_value, "subjectAlternativeName", altname);
15641565
}
1566+
ulong altcount = zend_hash_num_elements(Z_ARRVAL_P(&altname));
1567+
if (altcount > 0) {
1568+
add_assoc_zval(return_value, "subjectAlternativeName", &altname);
1569+
}
15651570
if (cert_str) {
15661571
X509_free(cert);
15671572
}
@@ -1570,10 +1575,7 @@ PHP_FUNCTION(openssl_x509_parse)
15701575
err_subitem:
15711576
zval_ptr_dtor(&subitem);
15721577
zval_ptr_dtor(&critext);
1573-
if (altname != NULL) {
1574-
zval_ptr_dtor(altname);
1575-
efree(altname);
1576-
}
1578+
zval_ptr_dtor(&altname);
15771579
err:
15781580
zend_array_destroy(Z_ARR_P(return_value));
15791581
if (cert_str) {

ext/openssl/openssl_backend_common.c

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ static void print_asn1_type(BIO *bio, ASN1_TYPE *ptr)
670670
/* Special handling of subjectAltName, see CVE-2013-4073
671671
* Christian Heimes
672672
*/
673-
int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **altname)
673+
int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval *altname)
674674
{
675675
GENERAL_NAMES *names;
676676
const X509V3_EXT_METHOD *method = NULL;
@@ -699,12 +699,6 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
699699
}
700700

701701
num = sk_GENERAL_NAME_num(names);
702-
if (altname != NULL) {
703-
if (*altname == NULL) {
704-
*altname = (zval *)safe_emalloc(1, sizeof(zval), 0);
705-
}
706-
array_init(*altname);
707-
}
708702
for (i = 0; i < num; i++) {
709703
GENERAL_NAME *name;
710704
ASN1_STRING *as;
@@ -720,7 +714,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
720714
if (altname != NULL) {
721715
add_assoc_string(&entry, "type", "email");
722716
php_openssl_add_assoc_asn1_string(&entry, "value", as);
723-
add_index_zval(*altname, index++, &entry);
717+
add_index_zval(altname, index++, &entry);
724718
}
725719
break;
726720
case GEN_DNS:
@@ -731,7 +725,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
731725
if (altname != NULL) {
732726
add_assoc_string(&entry, "type", "DNS");
733727
php_openssl_add_assoc_asn1_string(&entry, "value", as);
734-
add_index_zval(*altname, index++, &entry);
728+
add_index_zval(altname, index++, &entry);
735729
}
736730
break;
737731
case GEN_URI:
@@ -742,15 +736,15 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
742736
if (altname != NULL) {
743737
add_assoc_string(&entry, "type", "URI");
744738
php_openssl_add_assoc_asn1_string(&entry, "value", as);
745-
add_index_zval(*altname, index++, &entry);
739+
add_index_zval(altname, index++, &entry);
746740
}
747741
break;
748742
case GEN_DIRNAME:
749743
GENERAL_NAME_print(bio, name);
750744
if (altname != NULL) {
751745
add_assoc_string(&entry, "type", "DirName");
752746
php_openssl_add_assoc_name_entry(&entry, "value", name->d.dirn, PHP_OPENSSL_OID);
753-
add_index_zval(*altname, index++, &entry);
747+
add_index_zval(altname, index++, &entry);
754748
}
755749
break;
756750
case GEN_RID:
@@ -760,7 +754,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
760754
OBJ_obj2txt(buf, sizeof(buf)-1, name->d.rid, 1);
761755
add_assoc_string(&entry, "type", "Registered ID");
762756
add_assoc_string(&entry, "value", buf);
763-
add_index_zval(*altname, index++, &entry);
757+
add_index_zval(altname, index++, &entry);
764758
}
765759
break;
766760
case GEN_IPADD:
@@ -776,7 +770,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
776770
}
777771
add_assoc_string(&entry, "type", "IP Address");
778772
add_assoc_string(&entry, "value", buf);
779-
add_index_zval(*altname, index++, &entry);
773+
add_index_zval(altname, index++, &entry);
780774
}
781775
break;
782776
case GEN_OTHERNAME:
@@ -797,7 +791,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
797791
add_assoc_stringl(&value, oid, bio_buf->data, bio_buf->length);
798792
add_assoc_string(&entry, "type", "othername");
799793
add_assoc_zval(&entry, "value", &value);
800-
add_index_zval(*altname, index++, &entry);
794+
add_index_zval(altname, index++, &entry);
801795
BIO_free(bio_out);
802796
}
803797
break;
@@ -821,7 +815,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
821815
break;
822816
}
823817
add_assoc_stringl(&entry, "value", bio_buf->data, bio_buf->length);
824-
add_index_zval(*altname, index++, &entry);
818+
add_index_zval(altname, index++, &entry);
825819
BIO_free(bio_out);
826820
}
827821
}

ext/openssl/php_openssl_backend.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ X509 *php_openssl_x509_from_zval(
272272

273273
zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, bool raw);
274274

275-
int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **altname);
275+
int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval *altname);
276276

277277
STACK_OF(X509) *php_openssl_load_all_certs_from_file(
278278
char *cert_file, size_t cert_file_len, uint32_t arg_num);

0 commit comments

Comments
 (0)