Skip to content

Commit 9973658

Browse files
mk-jsmalyshev
authored andcommitted
Fix for php bug #64802 includes test case
1 parent 0154db1 commit 9973658

File tree

4 files changed

+116
-30
lines changed

4 files changed

+116
-30
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ PHP NEWS
1717
. Fixed bug #61268 (--enable-dtrace leads make to clobber
1818
Zend/zend_dtrace.d) (Chris Jones)
1919

20+
- Openssl:
21+
. Fixed bug #64802 (openssl_x509_parse fails to parse subject properly in
22+
some cases). (Mark Jones)
23+
2024
- Session:
2125
. Fixed bug #62129 (rfc1867 crashes php even though turned off). (gxd305 at
2226
gmail dot com)

ext/openssl/openssl.c

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,7 @@ static EVP_PKEY * php_openssl_generate_private_key(struct php_x509_request * req
561561

562562
static void add_assoc_name_entry(zval * val, char * key, X509_NAME * name, int shortname TSRMLS_DC) /* {{{ */
563563
{
564+
zval **data;
564565
zval *subitem, *subentries;
565566
int i, j = -1, last = -1, obj_cnt = 0;
566567
char *sname;
@@ -592,39 +593,27 @@ static void add_assoc_name_entry(zval * val, char * key, X509_NAME * name, int s
592593
sname = (char *) OBJ_nid2ln(nid);
593594
}
594595

595-
MAKE_STD_ZVAL(subentries);
596-
array_init(subentries);
596+
str = X509_NAME_ENTRY_get_data(ne);
597+
if (ASN1_STRING_type(str) != V_ASN1_UTF8STRING) {
598+
to_add_len = ASN1_STRING_to_UTF8(&to_add, str);
599+
} else {
600+
to_add = ASN1_STRING_data(str);
601+
to_add_len = ASN1_STRING_length(str);
602+
}
597603

598-
last = -1;
599-
for (;;) {
600-
j = X509_NAME_get_index_by_OBJ(name, obj, last);
601-
if (j < 0) {
602-
if (last != -1) break;
603-
} else {
604-
obj_cnt++;
605-
ne = X509_NAME_get_entry(name, j);
606-
str = X509_NAME_ENTRY_get_data(ne);
607-
if (ASN1_STRING_type(str) != V_ASN1_UTF8STRING) {
608-
to_add_len = ASN1_STRING_to_UTF8(&to_add, str);
609-
if (to_add_len != -1) {
610-
add_next_index_stringl(subentries, (char *)to_add, to_add_len, 1);
611-
}
612-
} else {
613-
to_add = ASN1_STRING_data(str);
614-
to_add_len = ASN1_STRING_length(str);
604+
if (to_add_len != -1) {
605+
if (zend_hash_find(Z_ARRVAL_P(subitem), sname, strlen(sname)+1, (void**)&data) == SUCCESS) {
606+
if (Z_TYPE_PP(data) == IS_ARRAY) {
607+
subentries = *data;
615608
add_next_index_stringl(subentries, (char *)to_add, to_add_len, 1);
609+
} else if (Z_TYPE_PP(data) == IS_STRING) {
610+
MAKE_STD_ZVAL(subentries);
611+
array_init(subentries);
612+
add_next_index_stringl(subentries, Z_STRVAL_PP(data), Z_STRLEN_PP(data), 1);
613+
add_next_index_stringl(subentries, (char *)to_add, to_add_len, 1);
614+
zend_hash_update(Z_ARRVAL_P(subitem), sname, strlen(sname)+1, &subentries, sizeof(zval*), NULL);
616615
}
617-
}
618-
last = j;
619-
}
620-
i = last;
621-
622-
if (obj_cnt > 1) {
623-
add_assoc_zval_ex(subitem, sname, strlen(sname) + 1, subentries);
624-
} else {
625-
zval_dtor(subentries);
626-
FREE_ZVAL(subentries);
627-
if (obj_cnt && str && to_add_len > -1) {
616+
} else {
628617
add_assoc_stringl(subitem, sname, (char *)to_add, to_add_len, 1);
629618
}
630619
}

ext/openssl/tests/bug64802.pem

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIGfzCCBWegAwIBAgIQSVCinGH6MkvjJZjRyjK9nTANBgkqhkiG9w0BAQUFADCB
3+
jjELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
4+
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxNDAyBgNV
5+
BAMTK0NPTU9ETyBFeHRlbmRlZCBWYWxpZGF0aW9uIFNlY3VyZSBTZXJ2ZXIgQ0Ew
6+
HhcNMTIwMjI5MDAwMDAwWhcNMTQwMjI4MjM1OTU5WjCCAW8xEjAQBgNVBAMTCXd3
7+
dy5yZC5pbzERMA8GA1UEAxMIcmRpby5jb20xDjAMBgNVBAMTBXJkLmlvMRUwEwYD
8+
VQQDEwxhcGkucmRpby5jb20xEjAQBgNVBAMTCWFwaS5yZC5pbzEQMA4GA1UEBRMH
9+
NDU4NjAwNzETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgECEwhE
10+
ZWxhd2FyZTEdMBsGA1UEDxMUUHJpdmF0ZSBPcmdhbml6YXRpb24xCzAJBgNVBAYT
11+
AlVTMQ4wDAYDVQQREwU5NDEwMzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG
12+
cmFuY2lzY28xFzAVBgNVBAkTDjE1NTAgQnJ5YW50IHN0MRMwEQYDVQQKEwpSZGlv
13+
LCBJbmMuMSMwIQYDVQQLExpDT01PRE8gRVYgTXVsdGktRG9tYWluIFNTTDEVMBMG
14+
A1UEAxMMd3d3LnJkaW8uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
15+
AQEAt0AgYOe8EBJNVBAuSJFLKHRKZn0/ObCLBFG4xVH/5fb1rfYHBT1XSjjOqR3t
16+
iGC/A3esF8YC7TuHQcTLVephx0DtJv1ASxRg3zPM8ebBRsuul18N0W+sY1aNXpkd
17+
36quxvjg5UdBrAweuekJ7OTSZcCe2Ry/SKBeZSWWtkWsI4krCLv7JaKUwxw2h+Hn
18+
TAZSBLVxz/mixF0WYdepYwnq2Hm7XvvVEIQ7wxOQ9bA7iCevLojZOnb39BT2QII7
19+
cy8AB47RZdfYg7UwaO3bST2rauA4MKar7/Ozqc0aemNFpLatJfgv07cydiuj9fsd
20+
5aE/c8is8C9M9+7MmSMkcNEgGwIDAQABo4IB8zCCAe8wHwYDVR0jBBgwFoAUiERR
21+
/1AqaV4tiPQhutkM8s7L6nwwHQYDVR0OBBYEFCrYw8bfrYJ61NS2yYx6/CnhjzT4
22+
MA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUF
23+
BwMBBggrBgEFBQcDAjBGBgNVHSAEPzA9MDsGDCsGAQQBsjEBAgEFATArMCkGCCsG
24+
AQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQUzBTBgNVHR8ETDBK
25+
MEigRqBEhkJodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9FeHRlbmRlZFZh
26+
bGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcmwwgYQGCCsGAQUFBwEBBHgwdjBOBggr
27+
BgEFBQcwAoZCaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPRXh0ZW5kZWRW
28+
YWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8v
29+
b2NzcC5jb21vZG9jYS5jb20wTAYDVR0RBEUwQ4IMd3d3LnJkaW8uY29tgglhcGku
30+
cmQuaW+CDGFwaS5yZGlvLmNvbYIFcmQuaW+CCHJkaW8uY29tggl3d3cucmQuaW8w
31+
DQYJKoZIhvcNAQEFBQADggEBAKFd4bPVFRyrlqIKPtrtMuqGqid6685ohxf0cv52
32+
sjdRYwLVTjnZOrmkDdNaF3R2A1ZlVMRN+67rK+qfY5sTeijFcudV3/i0PDtOFRwP
33+
6yYVD2uZmYkxfPiW309HPmDF+EzhxpVjWlTQEOwkfFLTmJmwl3Qu2Kffp8F1ENXW
34+
OTVNvj5VtMghvzu68PpzKl1VjlOR4Ej9NCwh1dUjNKEoTPzvpehXsIZ7jHSpX/T1
35+
wSSt9ckiechDdpgZXTzHgbxHNibK0Uhh+QhkBgYMj5F8qj5BlBhWAWqQa/VnEdmr
36+
Pfo7U+QmadoqQd7qt06hE2hG1nfZ0vPJDbWV3oVSwG2Yt7I=
37+
-----END CERTIFICATE-----

ext/openssl/tests/bug64802.phpt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
--TEST--
2+
Bug #64802: openssl_x509_parse fails to parse subject properly in some cases
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded("openssl")) die("skip");
6+
?>
7+
--FILE--
8+
<?php
9+
$cert = file_get_contents(__DIR__.'/bug64802.pem');
10+
$r = openssl_x509_parse($cert,$use_short_names=true);
11+
sort($r['subject']);
12+
var_dump( $r['subject'] );
13+
?>
14+
--EXPECTF--
15+
array(11) {
16+
[0]=>
17+
string(14) "1550 Bryant st"
18+
[1]=>
19+
string(5) "94103"
20+
[2]=>
21+
string(7) "4586007"
22+
[3]=>
23+
string(2) "CA"
24+
[4]=>
25+
string(26) "COMODO EV Multi-Domain SSL"
26+
[5]=>
27+
string(20) "Private Organization"
28+
[6]=>
29+
string(10) "Rdio, Inc."
30+
[7]=>
31+
string(13) "San Francisco"
32+
[8]=>
33+
string(2) "US"
34+
[9]=>
35+
array(2) {
36+
[0]=>
37+
string(2) "US"
38+
[1]=>
39+
string(8) "Delaware"
40+
}
41+
[10]=>
42+
array(6) {
43+
[0]=>
44+
string(9) "www.rd.io"
45+
[1]=>
46+
string(8) "rdio.com"
47+
[2]=>
48+
string(5) "rd.io"
49+
[3]=>
50+
string(12) "api.rdio.com"
51+
[4]=>
52+
string(9) "api.rd.io"
53+
[5]=>
54+
string(12) "www.rdio.com"
55+
}
56+
}

0 commit comments

Comments
 (0)