summaryrefslogtreecommitdiff
path: root/ext/openssl
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-07-22 10:20:37 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-07-22 10:21:24 +0200
commit657a832a77d3c0759dce095b619aa16cd5c360ce (patch)
tree7420e182cefb10fd331d23144ff91b3eccf8ed3a /ext/openssl
parent973be68c6318226367fd4685a598d12bf228509b (diff)
downloadphp-git-657a832a77d3c0759dce095b619aa16cd5c360ce.tar.gz
Fixed bug #79881
Diffstat (limited to 'ext/openssl')
-rw-r--r--ext/openssl/openssl.c8
-rw-r--r--ext/openssl/tests/bug79881.phpt45
2 files changed, 49 insertions, 4 deletions
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index 04cb9b0f23..8a45a6cfa2 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -3860,10 +3860,6 @@ static EVP_PKEY * php_openssl_evp_from_zval(
if (!what) {
TMP_CLEAN;
}
- if (resourceval) {
- *resourceval = res;
- Z_ADDREF_P(val);
- }
if (res->type == le_x509) {
/* extract key from cert, depending on public_key param */
cert = (X509*)what;
@@ -3887,6 +3883,10 @@ static EVP_PKEY * php_openssl_evp_from_zval(
zval_ptr_dtor_str(&tmp);
}
/* got the key - return it */
+ if (resourceval) {
+ *resourceval = res;
+ Z_ADDREF_P(val);
+ }
return (EVP_PKEY*)what;
}
} else {
diff --git a/ext/openssl/tests/bug79881.phpt b/ext/openssl/tests/bug79881.phpt
new file mode 100644
index 0000000000..915f95bdd4
--- /dev/null
+++ b/ext/openssl/tests/bug79881.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Bug #79881: Memory leak in openssl_pkey_get_public()
+--FILE--
+<?php
+
+$cert = "-----BEGIN CERTIFICATE-----
+MIIE4jCCAsqgAwIBAgIHBZCisfbbfTANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQG
+EwJHQjEPMA0GA1UECAwGTG9uZG9uMRcwFQYDVQQKDA5Hb29nbGUgVUsgTHRkLjEh
+MB8GA1UECwwYQ2VydGlmaWNhdGUgVHJhbnNwYXJlbmN5MSMwIQYDVQQDDBpNZXJn
+ZSBEZWxheSBJbnRlcm1lZGlhdGUgMTAeFw0xOTA4MjExNjAyMDhaFw0yMjEwMTMw
+NTQ0MjdaMHUxCzAJBgNVBAYTAkdCMQ8wDQYDVQQHDAZMb25kb24xOjA4BgNVBAoM
+MUdvb2dsZSBDZXJ0aWZpY2F0ZSBUcmFuc3BhcmVuY3kgKFByZWNlcnQgU2lnbmlu
+ZykxGTAXBgNVBAUTEDE1NjY0MDMzMjg0MDAyNTMwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQDdr1pIlcp/wH42Yb/kxiyx06DKKUO3vZj1Zx7W0kGOPlfP
+KroFcSLbCxnrzm1iENVbflBcbeGY1hF3c5cDxs/6bh88Y/5gA1rhP0q1c02Y9yPN
+Yo+pi6vfJK41CwsMHTie0U01Ghynzy/683+5tpigp2MccsrPFi5Sk7WMgR78Y6dt
+oEH9KZtdbuBlUzyEjnDzR5F7UB3YtrYVOKeYlsYEDmgLZKSMtP9M7/XIc8kUqT1L
+VDcB/kk46plGV0b93P+HSPdQcqAUIoqa/zmDnR8XZZGShg1OyJPhB75xCahMr6wL
+aXyEFtOwgjDnUZIb5DgpUVwHBq4Xw3QYYmtjk7eVAgMBAAGjbTBrMBgGA1UdJQEB
+/wQOMAwGCisGAQQB1nkCBAQwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTp
+PAThgC/ChBMtJnCe8v0az6r+xjAdBgNVHQ4EFgQUq3H778kIPz+bmq6to3MFNtGz
+qeQwDQYJKoZIhvcNAQEFBQADggIBACYc4ubDw8J7g+AYIS42K2RH/AZ5pf9KAZ+C
+OyFkZ5/LV3gNn1CAKFDOyjrGNA6r2yyHZ8TqyKguZqpFLVf1Vn7ll8u38hp7mBFO
+/bZGnCdZTtW8Ae8zNQXuFbXoItCk6unGPQsp7/5mHD8nsrqO512zEHuPA+b3v/ZR
+tSwkaJZM3W4LhHWiplEoA0F9CCnBKB1W00LDMZTLa4CRdGJlrjwchG0No+ItGrXZ
+cc+wLMic6UZ1QrXcvo9efj6/bjLHTee39u4SlIcuL20x97993HZyqP5ZSi+QkKfr
+Af441uJNHOFmoClCo6Wb2quNn6F6GvhYxkYcy/CgVP+VOfUBPIF8Ta2KrcI46fAL
+Qq6d/SK0GtjlRZME8h48tocBCGvtcZwmZnOQDLd3M51rmfXKB/6y70PjJqiX9ExR
+CJzpfafv1OaOqtWre6UofQsEx+jP+P7iGqQo+W9XrufnE7IDso+Za98G5cUIj61a
+U6sTKt8w+Ovkxr3UyC/QHdYYJ7nYQfrJ2ml9aAzs1ZlNS8YS0XXpzmpaZhSuhbfM
+F6F0Drg3+os4hVFiimUOjspZ4Su2EpsG86hdqJ/HHxTPPfgVlbBP0mexaRco3KVv
+pgJ4B+Hh5oOOh9TkR+D3ZKzjc6G2+4nhflYjI AD7B080Jshk6TcII1twXD9qBkvm
+9J3nrHWc
+-----END CERTIFICATE-----";
+
+$mem1 = memory_get_usage();
+$read = openssl_x509_read($cert);
+$key = openssl_pkey_get_public($read);
+unset($read, $key);
+$mem2 = memory_get_usage();
+var_dump($mem1 == $mem2);
+
+?>
+--EXPECT--
+bool(true)