Skip to content

Commit cc0efa6

Browse files
committed
Some simplification to eliminate memory management issues
1 parent 6893082 commit cc0efa6

3 files changed

Lines changed: 16 additions & 25 deletions

File tree

ext/openssl/openssl.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,7 @@ PHP_FUNCTION(openssl_x509_parse)
10141014
char *str_serial;
10151015
char *hex_serial;
10161016
char buf[256];
1017-
zval *altname = NULL;
1017+
zval altname;
10181018

10191019
ZEND_PARSE_PARAMETERS_START(1, 2)
10201020
Z_PARAM_OBJ_OF_CLASS_OR_STR(cert_obj, php_openssl_certificate_ce, cert_str)
@@ -1118,8 +1118,7 @@ PHP_FUNCTION(openssl_x509_parse)
11181118
add_assoc_zval(return_value, "purposes", &subitem);
11191119

11201120
array_init(&subitem);
1121-
1122-
1121+
array_init(&altname);
11231122
for (i = 0; i < X509_get_ext_count(cert); i++) {
11241123
int nid;
11251124
extension = X509_get_ext(cert, i);
@@ -1153,8 +1152,9 @@ PHP_FUNCTION(openssl_x509_parse)
11531152
BIO_free(bio_out);
11541153
}
11551154
add_assoc_zval(return_value, "extensions", &subitem);
1156-
if (altname != NULL) {
1157-
add_assoc_zval(return_value, "subjectAlternativeName", altname);
1155+
ulong altcount = zend_hash_num_elements(Z_ARRVAL_P(&altname));
1156+
if (altcount > 0) {
1157+
add_assoc_zval(return_value, "subjectAlternativeName", &altname);
11581158
}
11591159
if (cert_str) {
11601160
X509_free(cert);
@@ -1163,10 +1163,7 @@ PHP_FUNCTION(openssl_x509_parse)
11631163

11641164
err_subitem:
11651165
zval_ptr_dtor(&subitem);
1166-
if (altname != NULL) {
1167-
zval_ptr_dtor(altname);
1168-
efree(altname);
1169-
}
1166+
zval_ptr_dtor(&altname);
11701167
err:
11711168
zend_array_destroy(Z_ARR_P(return_value));
11721169
if (cert_str) {

ext/openssl/openssl_backend_common.c

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ static void print_asn1_type(BIO *bio, ASN1_TYPE *ptr)
674674
/* Special handling of subjectAltName, see CVE-2013-4073
675675
* Christian Heimes
676676
*/
677-
int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **altname)
677+
int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval *altname)
678678
{
679679
GENERAL_NAMES *names;
680680
const X509V3_EXT_METHOD *method = NULL;
@@ -703,12 +703,6 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
703703
}
704704

705705
num = sk_GENERAL_NAME_num(names);
706-
if (altname != NULL) {
707-
if (*altname == NULL) {
708-
*altname = (zval *)safe_emalloc(1, sizeof(zval), 0);
709-
}
710-
array_init(*altname);
711-
}
712706
for (i = 0; i < num; i++) {
713707
GENERAL_NAME *name;
714708
ASN1_STRING *as;
@@ -724,7 +718,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
724718
if (altname != NULL) {
725719
add_assoc_string(&entry, "type", "email");
726720
php_openssl_add_assoc_asn1_string(&entry, "value", as);
727-
add_index_zval(*altname, index++, &entry);
721+
add_index_zval(altname, index++, &entry);
728722
}
729723
break;
730724
case GEN_DNS:
@@ -735,7 +729,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
735729
if (altname != NULL) {
736730
add_assoc_string(&entry, "type", "DNS");
737731
php_openssl_add_assoc_asn1_string(&entry, "value", as);
738-
add_index_zval(*altname, index++, &entry);
732+
add_index_zval(altname, index++, &entry);
739733
}
740734
break;
741735
case GEN_URI:
@@ -746,15 +740,15 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
746740
if (altname != NULL) {
747741
add_assoc_string(&entry, "type", "URI");
748742
php_openssl_add_assoc_asn1_string(&entry, "value", as);
749-
add_index_zval(*altname, index++, &entry);
743+
add_index_zval(altname, index++, &entry);
750744
}
751745
break;
752746
case GEN_DIRNAME:
753747
GENERAL_NAME_print(bio, name);
754748
if (altname != NULL) {
755749
add_assoc_string(&entry, "type", "DirName");
756750
php_openssl_add_assoc_name_entry(&entry, "value", name->d.dirn, PHP_OPENSSL_OID);
757-
add_index_zval(*altname, index++, &entry);
751+
add_index_zval(altname, index++, &entry);
758752
}
759753
break;
760754
case GEN_RID:
@@ -764,7 +758,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
764758
OBJ_obj2txt(buf, sizeof(buf)-1, name->d.rid, 1);
765759
add_assoc_string(&entry, "type", "Registered ID");
766760
add_assoc_string(&entry, "value", buf);
767-
add_index_zval(*altname, index++, &entry);
761+
add_index_zval(altname, index++, &entry);
768762
}
769763
break;
770764
case GEN_IPADD:
@@ -780,7 +774,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
780774
}
781775
add_assoc_string(&entry, "type", "IP Address");
782776
add_assoc_string(&entry, "value", buf);
783-
add_index_zval(*altname, index++, &entry);
777+
add_index_zval(altname, index++, &entry);
784778
}
785779
break;
786780
case GEN_OTHERNAME:
@@ -801,7 +795,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
801795
add_assoc_stringl(&value, oid, bio_buf->data, bio_buf->length);
802796
add_assoc_string(&entry, "type", "othername");
803797
add_assoc_zval(&entry, "value", &value);
804-
add_index_zval(*altname, index++, &entry);
798+
add_index_zval(altname, index++, &entry);
805799
BIO_free(bio_out);
806800
}
807801
break;
@@ -825,7 +819,7 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **al
825819
break;
826820
}
827821
add_assoc_stringl(&entry, "value", bio_buf->data, bio_buf->length);
828-
add_index_zval(*altname, index++, &entry);
822+
add_index_zval(altname, index++, &entry);
829823
BIO_free(bio_out);
830824
}
831825
}

ext/openssl/php_openssl_backend.h

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

275275
zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, bool raw);
276276

277-
int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval **altname);
277+
int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension, zval *altname);
278278

279279
STACK_OF(X509) *php_openssl_load_all_certs_from_file(
280280
char *cert_file, size_t cert_file_len, uint32_t arg_num);

0 commit comments

Comments
 (0)