]> granicus.if.org Git - php/commitdiff
fix bug #61930: openssl corrupts ssl key resource when using openssl_get_publickey()
authorStanislav Malyshev <stas@php.net>
Sun, 17 Feb 2013 21:28:42 +0000 (13:28 -0800)
committerStanislav Malyshev <stas@php.net>
Sun, 17 Feb 2013 21:28:42 +0000 (13:28 -0800)
NEWS
ext/openssl/openssl.c
ext/openssl/tests/bug61930.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 37c1332be32b25d09ba07da2142ceb5d7be14cbc..bedc6a4dcf376f7dcadce25c57e2a305f573cc86 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,10 @@ PHP                                                                        NEWS
 - Mbstring:
   . mb_split() can now handle empty matches like preg_split() does. (Moriyoshi)
 
+- OpenSSL:
+  . Fixed bug #61930 (openssl corrupts ssl key resource when using 
+    openssl_get_publickey()). (Stas)
+
 - SPL:
   . Fixed bug #64228 (RecursiveDirectoryIterator always assumes SKIP_DOTS).
     (patch by kriss@krizalys.com, Laruence)
index 328c1ee9378a8259f42e0fc2d52006377c933bab..d7ac117e51c8f5d8ab0632c276af48d610b4b19e 100644 (file)
@@ -3204,6 +3204,7 @@ PHP_FUNCTION(openssl_pkey_get_public)
        if (pkey == NULL) {
                RETURN_FALSE;
        }
+       zend_list_addref(Z_LVAL_P(return_value));
 }
 /* }}} */
 
@@ -3240,6 +3241,7 @@ PHP_FUNCTION(openssl_pkey_get_private)
        if (pkey == NULL) {
                RETURN_FALSE;
        }
+       zend_list_addref(Z_LVAL_P(return_value));
 }
 
 /* }}} */
diff --git a/ext/openssl/tests/bug61930.phpt b/ext/openssl/tests/bug61930.phpt
new file mode 100644 (file)
index 0000000..55dc42f
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+Bug #61930: openssl corrupts ssl key resource when using openssl_get_publickey()
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+?>
+--FILE--
+<?php
+$cert = file_get_contents(__DIR__.'/cert.crt');
+
+$data = <<<DATA
+Please verify me
+DATA;
+
+$sig = 'f9Gyb6NV/ENn7GUa37ygTLcF93XHf5fbFTnoYF/O+fXbq3iChGUbET0RuhOsptlAODi6JsDLnJO4ikcVZo0tC1fFTj3LyCuPy3ZdgJbbVxQ/rviROCmuMFTqUW/Xa2LQYiapeCCgLQeWTLg7TM/BoHEkKbKLG/XT5jHvep1758A=';
+
+$key = openssl_get_publickey($cert);
+var_dump(openssl_get_publickey($key));
+var_dump(openssl_verify($data, base64_decode($sig), $key));
+?>
+--EXPECTF--
+resource(%d) of type (OpenSSL key)
+int(1)
+