com php-src: Fix #66942: openssl_seal() memory leak : ext/openssl/openssl.c
| From: | Stanislav Malyshev | Date: | Mon, 14 Apr 2014 20:38:32 +0000 |
| Subject: | com php-src: Fix #66942: openssl_seal() memory leak : ext/openssl/openssl.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-76892@lists.php.net to get a copy of this message | ||
Commit: 8d05a777adc13f12cc6504120d43b1cc020cfba3
Author: Chuan Ma <Chuan.Ma@avidlifemedia.com> Mon, 24 Mar 2014 23:24:41 -0400
Committer: Stanislav Malyshev <stas@php.net> Mon, 14 Apr 2014 13:38:32 -0700
Parents: fae8ed8ae9c1fa321ae261f7df956d65e68250e6
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=8d05a777adc13f12cc6504120d43b1cc020cfba3
Log:
Fix #66942: openssl_seal() memory leak
Fix #66952: memory leak in openssl_open()
Bugs:
https://bugs.php.net/66942
https://bugs.php.net/66952
Changed paths:
M ext/openssl/openssl.c
Diff:
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index af9664a..4f8f4b73 100755
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -4865,6 +4865,7 @@ PHP_FUNCTION(openssl_seal)
if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) {
RETVAL_FALSE;
+ EVP_CIPHER_CTX_cleanup(&ctx);
goto clean_exit;
}
@@ -4875,10 +4876,12 @@ PHP_FUNCTION(openssl_seal)
#endif
/* allocate one byte extra to make room for \0 */
buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx));
+ EVP_CIPHER_CTX_cleanup(&ctx);
if (!EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) || !EVP_SealUpdate(&ctx,
buf, &len1, (unsigned char *)data, data_len)) {
RETVAL_FALSE;
efree(buf);
+ EVP_CIPHER_CTX_cleanup(&ctx);
goto clean_exit;
}
@@ -4911,6 +4914,7 @@ PHP_FUNCTION(openssl_seal)
efree(buf);
}
RETVAL_LONG(len1 + len2);
+ EVP_CIPHER_CTX_cleanup(&ctx);
clean_exit:
for (i=0; i<nkeys; i++) {
@@ -4969,25 +4973,21 @@ PHP_FUNCTION(openssl_open)
if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) &&
EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
efree(buf);
- if (keyresource == -1) {
- EVP_PKEY_free(pkey);
- }
- RETURN_FALSE;
+ RETVAL_FALSE;
+ } else {
+ zval_dtor(opendata);
+ buf[len1 + len2] = '\0';
+ ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0);
+ RETVAL_TRUE;
}
} else {
efree(buf);
- if (keyresource == -1) {
- EVP_PKEY_free(pkey);
- }
- RETURN_FALSE;
+ RETVAL_FALSE;
}
if (keyresource == -1) {
EVP_PKEY_free(pkey);
}
- zval_dtor(opendata);
- buf[len1 + len2] = '\0';
- ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0);
- RETURN_TRUE;
+ EVP_CIPHER_CTX_cleanup(&ctx);
}
/* }}} */