Skip to content

Commit 9eff906

Browse files
committed
Fix #79145: openssl memory leak
We must increase the refcount of `return_value` only if `cert` is a resource; this is already done in `php_openssl_evp_from_zval()`, though.
1 parent 3046e35 commit 9eff906

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ PHP NEWS
1515
. Fixed bug #79084 (mysqlnd may fetch wrong column indexes with MYSQLI_BOTH).
1616
(cmb)
1717

18+
- OpenSSL:
19+
. Fixed bug #79145 (openssl memory leak). (cmb, Nikita)
20+
1821
- Reflection:
1922
. Fixed bug #79115 (ReflectionClass::isCloneable call reflected class
2023
__destruct). (Nikita)

ext/openssl/openssl.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4691,7 +4691,6 @@ PHP_FUNCTION(openssl_pkey_get_public)
46914691
RETURN_FALSE;
46924692
}
46934693
ZVAL_RES(return_value, res);
4694-
Z_ADDREF_P(return_value);
46954694
}
46964695
/* }}} */
46974696

@@ -4733,7 +4732,6 @@ PHP_FUNCTION(openssl_pkey_get_private)
47334732
RETURN_FALSE;
47344733
}
47354734
ZVAL_RES(return_value, res);
4736-
Z_ADDREF_P(return_value);
47374735
}
47384736

47394737
/* }}} */

ext/openssl/tests/bug79145.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Bug #79145 (openssl memory leak)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('openssl')) die('skip openssl extension not available');
6+
if (getenv('SKIP_SLOW_TESTS')) die('skip slow test');
7+
?>
8+
--FILE--
9+
<?php
10+
$b = '-----BEGIN PUBLIC KEY-----
11+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaFhc31WeskqxwI+Si5R/fZrLK
12+
pJOlABiI3RZfKCHJVrXl3IvcHDFM/BHKUJoSi/ee8GS9iw0G4Z1eCzJdthXxHARh
13+
j85Q5OliVxOdB1LoTOsOmfFf/fdvpU3DsOWsDKlVrL41MHxXorwrwOiys/r/gv2d
14+
C9C4JmhTOjBVAK8SewIDAQAC
15+
-----END PUBLIC KEY-----';
16+
17+
$start = memory_get_usage(true);
18+
for ($i = 0; $i < 100000; $i++) {
19+
$a = openssl_get_publickey($b);
20+
openssl_free_key($a);
21+
}
22+
$end = memory_get_usage(true);
23+
var_dump($end <= 1.1 * $start);
24+
?>
25+
--EXPECT--
26+
bool(true)

0 commit comments

Comments
 (0)