iliaa Thu Sep 7 14:11:06 2006 UTC
Modified files: (Branch: PHP_5_2)
/php-src/ext/openssl openssl.c
Log:
Fixed memory leaks in openssl test #004
http://cvs.php.net/viewvc.cgi/php-src/ext/openssl/openssl.c?r1=1.98.2.5.2.17&r2=1.98.2.5.2.18&diff_format=u
Index: php-src/ext/openssl/openssl.c
diff -u php-src/ext/openssl/openssl.c:1.98.2.5.2.17
php-src/ext/openssl/openssl.c:1.98.2.5.2.18
--- php-src/ext/openssl/openssl.c:1.98.2.5.2.17 Tue Sep 5 13:59:25 2006
+++ php-src/ext/openssl/openssl.c Thu Sep 7 14:11:05 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: openssl.c,v 1.98.2.5.2.17 2006/09/05 13:59:25 tony2001 Exp $ */
+/* $Id: openssl.c,v 1.98.2.5.2.18 2006/09/07 14:11:05 iliaa Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1780,6 +1780,7 @@
if (we_made_the_key) {
/* and a resource for
the private key */
+ zval_dtor(out_pkey);
ZVAL_RESOURCE(out_pkey,
zend_list_insert(req.priv_key, le_key));
req.priv_key = NULL; /*
make sure the cleanup code doesn't zap it! */
} else if (key_resource != -1) {
@@ -1882,7 +1883,16 @@
int free_cert = 0;
long cert_res = -1;
char * filename = NULL;
-
+ zval tmp;
+
+ Z_TYPE(tmp) = IS_NULL;
+
+#define TMP_CLEAN \
+ if (Z_TYPE(tmp) == IS_STRING) {\
+ zval_dtor(&tmp); \
+ return NULL; \
+ }
+
if (resourceval) {
*resourceval = -1;
}
@@ -1895,13 +1905,19 @@
php_error_docref(NULL TSRMLS_CC, E_WARNING, "key array
must be of the form array(0 => key, 1 => phrase)");
return NULL;
}
- convert_to_string_ex(zphrase);
- passphrase = Z_STRVAL_PP(zphrase);
+ //convert_to_string_ex(zphrase);
+ if (Z_TYPE_PP(zphrase) == IS_STRING) {
+ passphrase = Z_STRVAL_PP(zphrase);
+ } else {
+ tmp = **zphrase;
+ zval_copy_ctor(&tmp);
+ passphrase = Z_STRVAL(tmp);
+ }
/* now set val to be the key param and continue */
if (zend_hash_index_find(HASH_OF(*val), 0, (void **)&val) ==
FAILURE) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "key array
must be of the form array(0 => key, 1 => phrase)");
- return NULL;
+ TMP_CLEAN;
}
}
@@ -1911,7 +1927,7 @@
what = zend_fetch_resource(val TSRMLS_CC, -1, "OpenSSL
X.509/key", &type, 2, le_x509, le_key);
if (!what) {
- return NULL;
+ TMP_CLEAN;
}
if (resourceval) {
*resourceval = Z_LVAL_PP(val);
@@ -1928,28 +1944,30 @@
/* check whether it is actually a private key if
requested */
if (!public_key && !is_priv) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"supplied key param is a public key");
- return NULL;
+ TMP_CLEAN;
}
if (public_key && is_priv) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Don't know how to get public key from this private key");
- return NULL;
+ TMP_CLEAN;
} else {
+ if (Z_TYPE(tmp) == IS_STRING) {
+ zval_dtor(&tmp);
+ }
/* got the key - return it */
return (EVP_PKEY*)what;
}
}
/* other types could be used here - eg: file pointers and read
in the data from them */
-
- return NULL;
+ TMP_CLEAN;
} else {
/* force it to be a string and check if it refers to a file */
/* passing non string values leaks, object uses toString, it
returns NULL
* See bug38255.phpt
*/
if (!(Z_TYPE_PP(val) == IS_STRING || Z_TYPE_PP(val) ==
IS_OBJECT)) {
- return NULL;
+ TMP_CLEAN;
}
convert_to_string_ex(val);
@@ -1970,7 +1988,7 @@
in = BIO_new_mem_buf(Z_STRVAL_PP(val),
Z_STRLEN_PP(val));
}
if (in == NULL) {
- return NULL;
+ TMP_CLEAN;
}
key = PEM_read_bio_PUBKEY(in, NULL,NULL, NULL);
BIO_free(in);
@@ -1981,7 +1999,7 @@
if (filename) {
if (php_openssl_safe_mode_chk(filename
TSRMLS_CC)) {
- return NULL;
+ TMP_CLEAN;
}
in = BIO_new_file(filename, "r");
} else {
@@ -1989,7 +2007,7 @@
}
if (in == NULL) {
- return NULL;
+ TMP_CLEAN;
}
key = PEM_read_bio_PrivateKey(in, NULL,NULL,
passphrase);
BIO_free(in);
@@ -2007,6 +2025,9 @@
if (key && makeresource && resourceval) {
*resourceval = ZEND_REGISTER_RESOURCE(NULL, key, le_key);
}
+ if (Z_TYPE(tmp) == IS_STRING) {
+ zval_dtor(&tmp);
+ }
return key;
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php