diff --git a/NEWS b/NEWS index 01556b62951d..d76c5c65a619 100644 --- a/NEWS +++ b/NEWS @@ -138,6 +138,10 @@ PHP NEWS . Fixed bug GH-24577 (CE-cache flag on interned class name visible before map_ptr offset). (prateekbhujel) +- OpenSSL: + . Fixed bug GH-24784 (openssl_pkcs7_read() and openssl_cms_read() overwrite + certificates with CRLs). (Alexander Danilov) + - PDO: . Fixed invalid ATTR_ORACLE_NULLS values being accepted and truncated. (Ilia Alshanetsky) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 36d5a7ccb73c..ce0a1656cabb 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -6053,7 +6053,7 @@ PHP_FUNCTION(openssl_pkcs7_read) BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length); - add_index_zval(zout, i, &zcert); + add_next_index_zval(zout, &zcert); } BIO_free(bio_out); } @@ -6068,7 +6068,7 @@ PHP_FUNCTION(openssl_pkcs7_read) BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length); - add_index_zval(zout, i, &zcert); + add_next_index_zval(zout, &zcert); } BIO_free(bio_out); } @@ -6709,7 +6709,7 @@ PHP_FUNCTION(openssl_cms_read) BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length); - add_index_zval(zout, i, &zcert); + add_next_index_zval(zout, &zcert); } BIO_free(bio_out); } @@ -6724,7 +6724,7 @@ PHP_FUNCTION(openssl_cms_read) BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length); - add_index_zval(zout, i, &zcert); + add_next_index_zval(zout, &zcert); } BIO_free(bio_out); } diff --git a/ext/openssl/tests/gh24784.phpt b/ext/openssl/tests/gh24784.phpt new file mode 100644 index 000000000000..9cc7e7597bdf --- /dev/null +++ b/ext/openssl/tests/gh24784.phpt @@ -0,0 +1,57 @@ +--TEST-- +GH-24784 (openssl_pkcs7_read()/openssl_cms_read() CRLs overwrite certificates) +--EXTENSIONS-- +openssl +--FILE-- + $pkcs7, 'openssl_cms_read' => $cms] as $func => $data) { + echo $func, "\n"; + var_dump($func($data, $result)); + var_dump(count($result)); + foreach ($result as $i => $pem) { + echo $i, ': ', strtok($pem, "\n"), "\n"; + } +} +?> +--EXPECT-- +openssl_pkcs7_read +bool(true) +int(2) +0: -----BEGIN CERTIFICATE----- +1: -----BEGIN X509 CRL----- +openssl_cms_read +bool(true) +int(2) +0: -----BEGIN CERTIFICATE----- +1: -----BEGIN X509 CRL-----