Skip to content

Commit aadb707

Browse files
committed
Fix use after free
And define compat shim for EVP_PKEY_up_ref().
1 parent dad3384 commit aadb707

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

ext/openssl/openssl.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,11 @@ static int X509_get_signature_nid(const X509 *x)
388388
return OBJ_obj2nid(x->sig_alg->algorithm);
389389
}
390390

391+
static int EVP_PKEY_up_ref(EVP_PKEY *pkey)
392+
{
393+
return CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
394+
}
395+
391396
#endif
392397

393398
#define OpenSSL_version SSLeay_version
@@ -4496,18 +4501,22 @@ PHP_FUNCTION(openssl_pkey_get_public)
44964501
zval *cert;
44974502
EVP_PKEY *pkey;
44984503
php_openssl_pkey_object *key_object;
4504+
bool free_pkey;
44994505

45004506
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &cert) == FAILURE) {
45014507
RETURN_THROWS();
45024508
}
4503-
pkey = php_openssl_pkey_from_zval(cert, 1, NULL, 0, NULL);
4509+
pkey = php_openssl_pkey_from_zval(cert, 1, NULL, 0, &free_pkey);
45044510
if (pkey == NULL) {
45054511
RETURN_FALSE;
45064512
}
45074513

45084514
object_init_ex(return_value, php_openssl_pkey_ce);
45094515
key_object = Z_OPENSSL_PKEY_P(return_value);
45104516
key_object->pkey = pkey;
4517+
if (!free_pkey) {
4518+
EVP_PKEY_up_ref(pkey);
4519+
}
45114520
}
45124521
/* }}} */
45134522

0 commit comments

Comments
 (0)