diff options
| -rw-r--r-- | ext/openssl/openssl.c | 71 | ||||
| -rw-r--r-- | ext/openssl/tests/bug74022.pfx | bin | 0 -> 1678 bytes | |||
| -rw-r--r-- | ext/openssl/tests/bug74022.phpt | 19 |
3 files changed, 55 insertions, 35 deletions
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 47a28a1111..8de329aec7 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -2935,52 +2935,53 @@ PHP_FUNCTION(openssl_pkcs12_read) zval_dtor(zout); array_init(zout); - bio_out = BIO_new(BIO_s_mem()); - if (PEM_write_bio_X509(bio_out, cert)) { - BUF_MEM *bio_buf; - BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length); - add_assoc_zval(zout, "cert", &zcert); - } else { - php_openssl_store_errors(); + if (cert) { + bio_out = BIO_new(BIO_s_mem()); + if (PEM_write_bio_X509(bio_out, cert)) { + BUF_MEM *bio_buf; + BIO_get_mem_ptr(bio_out, &bio_buf); + ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length); + add_assoc_zval(zout, "cert", &zcert); + } else { + php_openssl_store_errors(); + } + BIO_free(bio_out); } - BIO_free(bio_out); - bio_out = BIO_new(BIO_s_mem()); - if (PEM_write_bio_PrivateKey(bio_out, pkey, NULL, NULL, 0, 0, NULL)) { - BUF_MEM *bio_buf; - BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(&zpkey, bio_buf->data, bio_buf->length); - add_assoc_zval(zout, "pkey", &zpkey); - } else { - php_openssl_store_errors(); + if (pkey) { + bio_out = BIO_new(BIO_s_mem()); + if (PEM_write_bio_PrivateKey(bio_out, pkey, NULL, NULL, 0, 0, NULL)) { + BUF_MEM *bio_buf; + BIO_get_mem_ptr(bio_out, &bio_buf); + ZVAL_STRINGL(&zpkey, bio_buf->data, bio_buf->length); + add_assoc_zval(zout, "pkey", &zpkey); + } else { + php_openssl_store_errors(); + } + BIO_free(bio_out); } - BIO_free(bio_out); - array_init(&zextracerts); + if (ca && sk_X509_num(ca)) { + array_init(&zextracerts); - for (i=0;;i++) { - zval zextracert; - X509* aCA = sk_X509_pop(ca); - if (!aCA) break; + for (i = 0; i < sk_X509_num(ca); i++) { + zval zextracert; + X509* aCA = sk_X509_pop(ca); + if (!aCA) break; - bio_out = BIO_new(BIO_s_mem()); - if (PEM_write_bio_X509(bio_out, aCA)) { - BUF_MEM *bio_buf; - BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(&zextracert, bio_buf->data, bio_buf->length); - add_index_zval(&zextracerts, i, &zextracert); + bio_out = BIO_new(BIO_s_mem()); + if (PEM_write_bio_X509(bio_out, aCA)) { + BUF_MEM *bio_buf; + BIO_get_mem_ptr(bio_out, &bio_buf); + ZVAL_STRINGL(&zextracert, bio_buf->data, bio_buf->length); + add_index_zval(&zextracerts, i, &zextracert); + } + X509_free(aCA); } - BIO_free(bio_out); - X509_free(aCA); - } - if(ca) { sk_X509_free(ca); add_assoc_zval(zout, "extracerts", &zextracerts); - } else { - zval_dtor(&zextracerts); } RETVAL_TRUE; diff --git a/ext/openssl/tests/bug74022.pfx b/ext/openssl/tests/bug74022.pfx Binary files differnew file mode 100644 index 0000000000..851dd9908d --- /dev/null +++ b/ext/openssl/tests/bug74022.pfx diff --git a/ext/openssl/tests/bug74022.phpt b/ext/openssl/tests/bug74022.phpt new file mode 100644 index 0000000000..0ab321c73a --- /dev/null +++ b/ext/openssl/tests/bug74022.phpt @@ -0,0 +1,19 @@ +--TEST-- +Bug #74022 PHP Fast CGI crashes when reading from a pfx file with valid password +--SKIPIF-- +<?php +if (!extension_loaded("openssl")) die("skip"); +?> +--FILE-- +<?php +$pfx = dirname(__FILE__) . DIRECTORY_SEPARATOR . "bug74022.pfx"; +$cert_store = file_get_contents($pfx); + +var_dump(openssl_pkcs12_read($cert_store, $cert_info, "csos")); +var_dump(openssl_error_string()); +?> +===DONE=== +--EXPECTF-- +bool(true) +bool(false) +===DONE=== |
